4. díl - Unity (C#) Android: Generování stalagů 2

C# .NET Unity 3D Unity (C#) Android: Generování stalagů 2

Tento videotutoriál navazuje na předchozí díl o programování her pro Android v Unity, kde jsme se zabývali tvorbou mapy. Dnešní díl se zabývá opravou a úpravou mapy a jejím generováním.

Video

Generování mapy

Přidávám skript, který je použit ve videu, pokud se vám ho nechce opisovat :) Je to skript pro generování levelu. Prozatím je to finální verze. Oproti předchozímu dílu má hned několik úprav.

using UnityEngine;
using System.Collections;

public class StartScript : MonoBehaviour {

    public GameObject[] stalagPrefabs;
    public float distance = 10;
    public float offset = 10;
    public int count = 2;

    public float minHeight;
    public float maxHeight;

    public float minWidth;
    public float maxWidth;


    public Vector3 lastPos;

    void GenerateSet()
    {
        for (int i = 0; i < count; i++)
        {
            Vector2 pos = new Vector2();
            pos.x = lastPos.x + (2*distance) + offset + i * distance;

            int r = Random.Range(0, 2);
            int rotateIndicator = 1;
            if (r == 0)
            {
                pos.y = 4.5f;
            }
            else
            {
                pos.y = -4.5f;
                rotateIndicator = -1;
            }
            GenerateStalag(pos, rotateIndicator);
        }
    }

        // Use this for initialization
        void Start () {
        lastPos = transform.position;
        //GenerateSet();
        }

    void GenerateStalag(Vector2 p, int rotateInd)
    {
        GameObject g = Instantiate(stalagPrefabs[Random.Range(0, stalagPrefabs.Length)], p, Quaternion.identity) as GameObject;
        Vector3 theScale = g.transform.localScale;

        theScale.y = Random.Range(minHeight, maxHeight) * rotateInd;
        theScale.x = Random.Range(minWidth, maxWidth);
        g.transform.localScale = theScale;

        Bounds b = g.GetComponent<SpriteRenderer>().bounds;
        p.y -= b.size.y / 2 * rotateInd;

        g.transform.position = p;
    }


    void OnTriggerEnter2D(Collider2D col)
    {
        if(col.CompareTag("Player"))
        {
            GenerateSet();
            lastPos = transform.position;
            lastPos.x += count * distance;
            transform.position = lastPos;
        }
    }
}

Jak hra vypadá teď?

Problémy?

Pokud máte nějaké otázky ohledně nastavování, neváhejte se zeptat v komentářích, nebo mi napsat do zpráv.


 

  Aktivity (1)

Článek pro vás napsal vratislavino
Avatar
Autor se věnuje programování v C#, především pak ve vývojovém prostředí Unity3D. Má asi pětileté zkušenosti s programováním a momentálně pracuje na připravované hře Azulgar: Beyond The Frontiers.

Jak se ti líbí článek?
Celkem (4 hlasů) :
4.54.54.54.54.5


 


Miniatura
Všechny články v sekci
Programování her v Unity3D v C# .NET
Miniatura
Následující článek
Unity (C#) Android: GUI - menu 1

 

 

Komentáře
Zobrazit starší komentáře (9)

Avatar
OZiiK
Člen
Avatar
OZiiK:

Děkuji jsi fakt super. Ne jako ti co říkají "hele tak si to video udělej sám". Děkuji že jsi moji kritiku vzal tak lehce už jsem koukal na menu a super moc se mi líbí. Jen bych nerad, aby jsi tím přestal protože teď je to to nejlepší.

Odpovědět  +1 27.7.2014 20:15
Dokud
Avatar
peter54321
Člen
Avatar
peter54321:

Zdravim,
Chcem sa spýtať:
Stalagy cez ktoré si prešiel a už nie sú vidieť nebolo by prospešné odstraniť?
Ak by som sa dostal daleko tak by ich tam bolo vela vygenerovaných a mohli by spomaliť celú hru. Môj názor.

 
Odpovědět 14.8.2014 10:45
Avatar
vratislavino
Redaktor
Avatar
Odpovídá na peter54321
vratislavino:

Ahoj, díky za tip :) rozhodně to pořeším v příštím videu :)

Odpovědět 14.8.2014 11:19
Hlavou teď neprorazíš, ale stojí za to to zkoušet :)
Avatar
peter54321
Člen
Avatar
peter54321:

Neviem či si si všimol ale v sprite editore vieš nastaviť pozíciu podľa ktorej sa majú objecti zarovnavať.
Myslím si že je to jednoduchšie ako to scriptovať.

 
Odpovědět 15.8.2014 17:55
Avatar
vratislavino
Redaktor
Avatar
Odpovídá na peter54321
vratislavino:

Nevím, co jsem podle tebe skriptoval zbytečně :-) každý Sprite má jiný collider, takže se musí každý zvlášť dat do prefabu. Dělám to většinou do jednoho PNG souboru do mřížky a nechám to nasekat jako grid ve Sprite editoru. Pro animace je to třeba lepší, protože se ta animace neklepe. Jinak to ten editor umí ořezat podle hranic spritu, ale už kvůli animacim nemam tuhle možnost rád :-)

Odpovědět 15.8.2014 18:15
Hlavou teď neprorazíš, ale stojí za to to zkoušet :)
Avatar
Odpovídá na vratislavino
jaromir.vykydal:

peter54321 má pravdu, jen jsi ho asi plně nepochopil, skriptovat se určitě musí, ale když nastavím ve Sprite Editoru hodnotu Pivota na "TopLeft" (defaultně nastaveno "Center"), tak je otáčení a umístění stalagů jednodušší. Tvoje řešení bylo složité, ale určitě sem se něco přiučil. Díky

 
Odpovědět  +1 24.10.2014 18:06
Avatar
vratislavino
Redaktor
Avatar
Odpovídá na jaromir.vykydal
vratislavino:

Svatá pravda :) díky za tip, ještě mě nenapadlo to použít :)

Odpovědět 26.10.2014 22:34
Hlavou teď neprorazíš, ale stojí za to to zkoušet :)
Avatar
Štefan Mezei:

Zdravim, mam taky problem ze ak sa player pohybuje prilis rychlo, napriklad ak zvacsim gravitaciu, tak jednoducho preleti cez ten edge collider ako keby tam ani nebol... da sa to nejako osetrit?

 
Odpovědět 7.9.2015 6:59
Avatar
vratislavino
Redaktor
Avatar
Odpovídá na Štefan Mezei
vratislavino:

Ahoj, ve třídě PlayerMoveScript jsme si vytvářeli 2 proměnné speed a flapAmount. Pokud měníš speed v kódu tam, kde proměnnou vytváříš (mimo metodu), tato hodnota bude ignorována. Musíš se podívat na objekt, na kterém je tento skript připojen a nastavit v Inspektoru menší hodnotu. Zkus si s tím takhle pohrát.

vel.x = speed * Time.deltaTime;

Tenhle řádek (z 2. dílu) by měl zajistit plynulý pohyb dopředu, je závislý jen na proměnné speed.

Co se týče edge collideru, zkus ho nahradit box colliderem, četl jsem, že edge je nespolehlivý, protože má náročnější výpočet na kolizi.

Odpovědět 7.9.2015 13:18
Hlavou teď neprorazíš, ale stojí za to to zkoušet :)
Avatar
Štefan Mezei:

Ďakujem za opdpoveď. Použil som box collider a pri veľkej gravitácii sa to najprv správalo rovnako ako s edge ale stačilo len o niečo zväčšiť ten collider aby bol hrubší a už cez neho player neprechádza :)

 
Odpovědět 8.9.2015 9:12
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 19. Zobrazit vše