IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

4. diel - Unity (C #) Android: Generovanie Stalag, 2. časť

V minulej lekcii, Unity (C #) Android: Generovanie Stalag , sme si vytvorili okolo mapy pohyblivý tunel, čím sme ju ohraničili, a vygenerovali si 50 Stalag. Mapa má však ešte stále rezervy a preto budeme v generovaní pokračovať aj v dnešnom Unity 3D Android tutoriálu.

Rôzna výška prekážok

Aby všetky prekážky neboli rovnako veľké, upravíme si metódu GenerateStalag() v našom StartScript do nasledujúcej podoby:

void GenerateStalag(Vector2 p)
{
    GameObject g = Instantiate(stalagPrefab, p, Quaternion.identity) as GameObject;
    Vector3 scale = g.transform.localScale;

    scale.y = Random.Range(0.5f, 1.2f);

    g.transform.localScale = scale;
}

Za vysvetlenie stojí riadok:

GameObject g = Instantiate(stalagPrefab, p, Quaternion.identity) as GameObject;

Kód funguje rovnako ako predtým, len s menším rozdielom. Náš vytvorený objekt sa nám uloží do premennej. S touto premennou následne môžeme pracovať a upraviť ľubovoľné vlastnosti nového objektu.

Vytvoríme si plne vyfarbené okraje našej obrazovky, aby sme tam nemali takú dieru. Výplň si presunieme do objektu Borders1 a uložíme.

V Prefab nášho Stalag si zmeníme Order in Layer na -1 a potvrdíme. To zabezpečí, aby sa nám neprekrýval s inými sprity.

Aby naša hra bola lepšie optimalizovaná, Prefab nášho travertínu vytvoríme vlastný vrstvu. Pomenujeme si ju StalagLayer a to isté urobíme s Prefab múry, ktoré vytvoríme vrstvu BorderLayer:

Tvorba 2D arkády pre Android v Unity

Ďalej v Edit -> Project settings -> Physics2D nastavíme, aby spolu StalagLayer a BorderLayer v konflikte. To robíme preto, že na oboch objektoch máme Collider a keby spolu tieto objekty neustále kolidovali, mohla by sa tým razantne zvýšiť náročnosť našej hry, ktorá by sa mohla následne kosiť:

Tvorba 2D arkády pre Android v Unity

Stalag z krajiny

Zatiaľ nám prekážka visí iba zo stropu, zariadime, aby trčala i zo zeme. To vykonáme ďalšie zmenou skriptu StartScript:

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

        int r = Random.Range(0, 2);
        int rotateIndicator = 1;
        if (r == 0)
        {
            pos.y = 4.5f; // může se lišit podle toho. jak máte vzdálený strop a podlahu od sebe
        }
        else
        {
            pos.y = -4.5f; // může lišit podle toho, jak máte vzdálený strop a podlahu od sebe
            rotateIndicator = -1;
        }

        GenerateStalag(pos, rotateIndicator);
    }
}

void GenerateStalag(Vector2 p, int rotateInd)
{
     GameObject g = Instantiate(stalagPrefab, p, Quaternion.identity) as GameObject;
     Vector3 scale = g.transform.localScale;

     scale.y = Random.Range(0.5f, 1.2f)  *rotateInd;
     g.transform.localScale = scale;
}

Keď hru spustíme, môžeme vidieť, že sa nám Stalag náhodne otočili.

Optimalizácia

Ďalej si hru trochu optimalizujeme. Teraz generujeme všetky Stalag naraz, lenže to môže byť celkom zbytočné. Teda ich budeme vždy generovať len pár.

Na náš StartingObject si pridáme Box Collider a Odznačte, že sa jedná o trigger. Zväčšíme a posunieme ho tak, aby bol na výšku cez celú našej hraciu plochu a zároveň bol aspoň trochu široký. Následne ho presunieme pred hráča. Ďalej hráči pridáme tag Player a upravíme si náš skript:

public GameObject stalagPrefab;
public float distance = 10;
public float offset = 10;
public int count = 50;

public Vector3 lastPos;

void Start()
{
    lastPos = transform.position;
    //GenerateSet(); // již nepotřebujeme ve startu
}

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; // toto číslo se může lišit podle toho, jak máte vzdálený strop a podlahu od sebe
        }
        else
        {
            pos.y = -4.5f; // toto číslo se může lišit podle toho, jak máte vzdálený strop a podlahu od sebe
            rotateIndicator = -1;
        }

        GenerateStalag(pos, rotateIndicator);
    }
}

void GenerateStalag(Vector2 p, int rotateInd)
{
    GameObject g = Instantiate(stalagPrefab, p, Quaternion.identity) as GameObject;
    Vector3 scale = g.transform.localScale;


    scale.y = Random.Range(0.5f, 1.2f)  *rotateInd;

    g.transform.localScale = scale;
}

// vždy, když náš objekt proletí colliderem tohoto objektu, vygenerují se nové překážky a následně se náš celý objekt posune
void OnTriggerEnter2D(Collider2D col)
{
    if (col.CompareTag("Player"))
    {
        GenerateSet();
        lastPos = transform.position;
        lastPos.x += count * distance;
        transform.position = lastPos;
    }
}

Ďalej zaistíme, aby sa naše prekážky generovali na správnych miestach. Stačí iba ľahko upraviť našej metódu na generovanie:

void GenerateStalag(Vector2 p, int rotateInd)
{
    GameObject g = Instantiate(stalagPrefab, p, Quaternion.identity) as GameObject;
    Vector3 scale = g.transform.localScale;

    scale.y = Random.Range(0.5f, 1.2f)  *rotateInd;

    g.transform.localScale = scale;

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

    g.transform.position = p;
}

Bounds sú hranice (veľkosť) objektu. Vzali sme si teda veľkosť nášho Spritu na stalagmit a vypočítali sme vďaka tomu ich umiestnenie.

Keď hru spustíme, môžeme vidieť, že už vyzerá pekne.

Náhodná šírka a viac druhov Stalag

Hráča môže omrzieť, keď uvidí iba jednu a tú istú prekážku stále dookola, len inak veľkú. Pridáme teda aj náhodnú šírku Stalag a ďalej i viac druhov.

Viac druhov Stalag

Aby sme generovali viac druhov Stalag, potrebujeme si vytvoriť pole našich prekážok:

public GameObject[] stalagPrefab;

Z našej premenné pre Prefab vytvoríme pole. A následne musíme upraviť ešte časť kódu na generovanie:

GameObject g = Instantiate(stalagPrefab[Random.Range(0, stalagPrefab.Length)], p, Quaternion.identity) as GameObject;

Random.Range(0, stalagPrefab.Length) nám zaistí vygenerovanie stalagmitov na náhodnom indexu z celej dĺžky poľa našich stalagmitov.

Teraz, keď sa pozrieme do Inspector na náš StartingObject, môžeme tam vidieť možnosť zvoliť veľkosť nášho poľa. My zvolíme 4.

Môžete použiť sprity, ktoré som vám dal k stiahnutiu a alebo si môžete vytvoriť vlastné.

Následne urobíme to isté ako s prvým Stalag. Nastavíme farbu, Collider, order in layer, Layer a uložíme ako Prefab. Následne tento Prefab dáme do nášho poľa.

Keď hru spustíme, môžeme vidieť, že sa generujú rôzne druhy.

Takto si môžeme vytvoriť ľubovoľný počet rôznych Stalag. Ak nám budú pridať veľké a alebo malé, môžeme si veľkosť generovanie ľubovoľne upraviť.

Pre lepšiu prehľadnosť si vytvoríme ďalšie premenné:

public float minHeight;
public float maxHeight;
public float minWidth;
public float maxWidth;

Vo finále si upravíme našej metódu na generovanie, aby sa náhodne určovala aj šírka Stalag:

scale.y = Random.Range(minHeight, maxHeight)  *rotateInd;
scale.x = Random.Range(minWidth, maxWidth);

Od teraz môžeme pohodlne z Inspector meniť naše hodnoty a nemusíme pracne hľadať v kóde.

Záver

Pre dnešok to bude všetko. Dúfam, že sa vám séria tutoriálov páči a naučili ste sa niečo nové. Ak máte nejaké pripomienky či nápady, zanechajte komentár, rád sa inšpirujem. Nabudúce sa v lekcii Unity (C #) Android: Nastavenie prostredia pozrieme na vytvorenie menu.


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 421x (92.84 kB)

 

Predchádzajúci článok
Unity (C #) Android: Generovanie Stalag
Všetky články v sekcii
Tvorba 2D arkády pre Android v Unity
Preskočiť článok
(neodporúčame)
Unity (C #) Android: Nastavenie prostredia
Článok pre vás napísal Jan Kubice
Avatar
Užívateľské hodnotenie:
1 hlasov
Aktivity