IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 9 - Unity (C#) Android: MenuPart, Eraser, pozadí 2

V minulé lekci, Unity (C#) Android - MenuPart, Eraser a pozadí, jsme pracovali na odstraňování již zdolaných překážek a také na nekonečném opakování pozadí. Přidali jsme i další herní menu.

V dnešním Unity tutoriálu se podíváme na ničení stalagů a vytvoříme si arkádové levely.

Vylepšení ničení

Začněme podstatnější funkcí a to ničením stalagů. Pokud momentálně do překážky narazíme, hráč se zasekne a v podstatě se dál nedostaneme. Pojďme to napravit.

Skript kolize hráče

Skript si vytvoříme na hráčovi, jelikož s postavou můžeme reagovat na více kolizí, než jen na tu s překážkou. Skript bude sledovat čeho se postava dotkla a podle toho spustíme reakční skript na daném objektu, který se s hráčem srazil.

Playerovi přidáme PlayerCollisionDetection skript, který bude prozatím jen kontrolovat, zda se s něčím srazil:

void OnTriggerEnter2D(Collider2D col) {
    print("kolize");
}

Abychom zajistili, že nám kolize bude správně fungovat, přidáme na hráči další circle collider. Tentokrát ho ale uděláme o maličko větší a nastavíme ho jako isTrigger. Tím zajistíme správné detekování.

Dále určíme, co se stane, podle typu objektu, kterého jsme se dotkli.

Reakční skript pro stalagy

Nejdříve si vytvoříme skript pro stalagy. Jak si určitě pamatujete, stačí zvolit prefaby, které máme uložené, a pouze jim přidat potřebný skript. To uděláme tak, že si nejdříve vytvoříme skript Stalag. Zvolíme všechny prefaby, které chceme, a klikneme na Add component. Zobrazí se nám takovéto okénko:

Tvorba 2D arkády pro Android v Unity

a zvolíme náš skript:

Tvorba 2D arkády pro Android v Unity

Skript bude obsahovat jednu metodu, která bude reagovat na kolizi. Dále také bude mít jednu proměnnou, kam vložíme particles, které vytvoříme:

Public GameObject parts;

void React()
{
    Destroy(gameObject);
}

Samo o sobě by se zatím samozřejmě nic nestalo. Proto metodu musíme někde zavolat. To učiníme v našem PlayerCollisionDetection skriptu.

Zavolání pomocí SendMessage()

Jelikož při kolizi máme přístup k našemu objektu, jsme schopni k němu přistoupit a poslat mu zprávu, co má udělat:

void OnCollisionEnter2D(Collision2D col)
{
    if(col.collider.CompareTag("Stalag"))
    {
        GameObject stalag = col.collider.gameObject;
        stalag.SendMessage("React");
    }
}

Metoda SendMessage() nám na daném objektu zavolá metodu s názvem, který jsme napsali do parametru.

Metodu musíme zapsat jako textový řetězec, tak si musíme dát pozor, abychom název metody napsali přesně. Tento způsob doporučuji používat jen pokud je na daném objektu málo skriptů a metod, při větším množství to může mít vliv na výkon.

Zavolání pomocí GetComponent()

Druhá možnost je nastavit metodu React() jako public a při kolizi ji zavolat pomocí GetComponent():

void OnCollisionEnter2D(Collision2D col)
{
    if(col.collider.CompareTag("Stalag"))
    {
        GameObject stalag = col.collider.gameObject;
        stalag.GetComponent<Stalag>().React()
    }
}

V našem případě ale perfektně stačí SendMessage(). Nyní, kdybychom hru spustili a narazili do stalagu, zmizí. Je to přesně to, co jsme chtěli, ale nevypadá to moc hezky. Chtělo by to nějaký efekt.

Efekt zničení

Přidáme si tedy nějaké to rozpadnutí. Vytvoříme si pro to nový GameObject, pojmenujeme si ho ParticlesIce, a přidáme si na něj Particle System:

Tvorba 2D arkády pro Android v Unity
Tvorba 2D arkády pro Android v Unity

Nastavíme několik vlastností. Gravity Multiplier zvětšíme na 0.3. Vidíme, jak naše částečky padají. Dále chceme, aby se efekt přehrál pouze jednou. Najdeme si Looping a zrušíme ho. Duration nastavíme na 0.5. Dále v Emission nastavíme Rate na 20:

Tvorba 2D arkády pro Android v Unity

To už vypadá docela slušně! Jenže stále máme obyčejná kolečka a chceme, aby se nám generoval nějaký pěkný tvar. Tento tvar zas naleznete níže ke stažení. Pokud si ovšem chcete vytvořit vlastní dílo a nebo najít jiný, klidně můžete.

Materiál

Abychom Particle Systémem mohli generovat vlastní grafické prvky, musíme si nejdříve vytvořit nový Material. Klasicky klikneme pravým do Assets:

Tvorba 2D arkády pro Android v Unity

Ten pojmenujeme IceMat a nastavíme mu náš kus ledu. Shader nastavíme na LegacyShader –> Particles –> Additive:

Tvorba 2D arkády pro Android v Unity

Tento materiál v Particle Systému vložíme do Renderer a Material. Z objektu vytvoříme prefab:

Tvorba 2D arkády pro Android v Unity

Nyní na všech prefabech stalagu můžeme vidět jedno volné místečko u Stalag skriptu. Na toto místo vložíme náš ParticleIce objekt. Díky tomu máme přístup k tomuto objektu přes náš skript.

Otevřeme si Stalag skript ve kterém, než zničíme náš stalag, vytvoříme efekt:

Destroy(Instantiate(parts, transform.position, Quaternion.identity), 2);

Vypadá to složitě, ale vlastně ani není. Říkáme, že chceme zničit objekt, který se vytvoří, a chceme ho zničit za dvě sekundy od provedení této řádky. Pomocí Quaterion.identity zajistíme, aby se vygenerovaný objekt neotočil v nějaké ose.

Výsledný Stalag skript vypadá takto:

void React()
{
    Destroy(Instantiate(parts, transform.position, Quaternion.identity), 2);
    Destroy(gameObject);
}

V podstatě to je vše ohledně ničení stalagů. Nyní se můžeme pustit do vytvoření několika levelů do našeho arkádového módu.

Nové levely

Pro usnadnění práce si můžeme pouze zkopírovat všechny objekty ve scéně, na které momentálně jsme. Objekty si všechny označíme a zkopírujeme klasickým Ctrl + C. Vytvoříme si novou scénu, do které všechny objekty pomocí Ctrl + V vložíme. Prvně smažeme StartingObject, který nám tu k ničemu nebude. Generuje totiž stalagy a to my v arkádovém módu nechceme, protože si levely naklikáme sami.

Na zkoušku si vytvoříme jednoduchý level, kde hráč proletí pár překážkami, kde se bude nacházet konec. Pro tento účel jsem vám vyrobil také nějakou grafiku, abyste se nemuseli zdržovat hledáním na Google a mohli zatím bezstarostně pokračovat v tutoriálu.

Sprite

Sprite si roztáhneme:

Tvorba 2D arkády pro Android v Unity

Na tento sprite si vložíme collider. Collider nastavíme na Trigger a přidáme mu End skript. Objekt si také pojmenujeme endLine. Objekt bude ve finále vypadat takto:

Tvorba 2D arkády pro Android v Unity

Budeme zase hlídat, zda se tohoto objektu dotkl hráč:

bool isEnd = false;

void OnTriggerEnter2D(Collider2D col)
{
    if(col.CompareTag("Player"))
    {
        isEnd = true;
        Time.timeScale = 0;
    }
}

Pokud se tedy hráč dotkne cíle, nastavíme Time.timeScale na 0, což nám stopne hru.

Menu

Sice jsme si v minulých lekcích říkali, že nebudeme používat programovací způsob dělání menu, ale udělejme výjimku, protože se to v tomto případě docela hodí:

void OnGUI()
{
    if (isEnd)
    {
        if (GUILayout.Button("Menu"))
        {
            Time.timeScale = 1;
            SceneManager.LoadScene("Menu2");
        }

        if (GUILayout.Button("Next level"))
        {
            Time.timeScale = 1;
            string currLevelId = Application.loadedLevelName;
            currLevelId = Application.loadedLevelName.Substring(currLevelId.Length - 2);

            print("Aktualni level: " + currLevelId);

            int currLevelInt = int.Parse(currLevelId);
            currLevelInt++;

            string newLevelName = "Level0" + currLevelInt;

            SceneManager.LoadScene(newLevelName);

        }

        if (GUILayout.Button("Restart"))
        {
            Time.timeScale = 1;
            SceneManager.LoadScene(Application.loadedLevelName);
        }

    }
}

Při načítání menu si nesmíme zapomenout dát pozor na název menu, případně na index. Jinak si myslím, že ohledně menu není nutné nic vysvětlovat, jelikož jsme si vše již vysvětlili v předchozích lekcích o menu.

Možná vás zaujal kód:

string currLevelId = Application.loadedLevelName;
currLevelId = Application.loadedLevelName.Substring(currLevelId.Length - 2);

Levely si budeme pojmenovávat Levelxx, kde xx je číslo našeho levelu (01, 02,..99). Tímto kódem si zjistíme index v názvu našeho levelu, který si dále převedeme na typ int a využijeme ho na načtení následujících levelů. Sice můžeme spouštět levely jen podle indexu scénáře, ale to bychom museli mít levely seřazené. Takto můžeme mít levely rozházené jak chceme a stále je dokážeme spustit jen díky názvu. Pozor na to, že tento způsob je možné použít pouze na rozsah level00 - level99 (přičemž pravděpodobně budeme spíš začínat level01).

Když nyní s hráčem proletíme cílem, objeví se nám menu v levé horní části obrazovky:

Tvorba 2D arkády pro Android v Unity

Zatím to necháme takto a vylepšíme ho v budoucnu. Také někdy později ošetříme případ, kdy hráč pokoří poslední arkádový level.

Aby nám fungovalo tlačítko "Menu", musíme si přiřadit index a nebo název menu.

Ve finále si vytvoříme druhý level, pojmenujeme si ho Level02:

Tvorba 2D arkády pro Android v Unity

A nezapomeneme jej přidat v Build Settings.

To pro dnešní tutoriál bude vše. Doufám, že jste se dozvěděli něco nového :-)

V příští lekci, Unity (C#) Android: Přestavba, bodáky, upravíme pohyb hráče a pozměníme i způsob, jakým se nám posouvají překážky.


 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 354x (11.74 kB)

 

Předchozí článek
Unity (C#) Android - MenuPart, Eraser a pozadí
Všechny články v sekci
Tvorba 2D arkády pro Android v Unity
Přeskočit článek
(nedoporučujeme)
Unity (C#) Android: Přestavba, bodáky
Článek pro vás napsal Jan Kubice
Avatar
Uživatelské hodnocení:
1 hlasů
Aktivity