MS Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
50 % bodů zdarma na online výuku díky naší Slevové akci!

Lekce 8 - 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 PlayerCollisionScript, 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 StalagScript. Zvolíme všechny prefaby, které chceme, a klikneme na Add component. Zobrazí se nám takovéto okénko:

a zvolíme náš skript:

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 PlayerCollisionScript.

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<StalagScript>().React()
    }
}
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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:

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:

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:

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

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

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

Otevřeme si StalagScript ve kterém, než tedy 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ý StalagScript 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 Arcade 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 Arcade 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:

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

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 - 1);

            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 - 1);

Levely si budeme pojmenovávat Level0x, kde x je číslo našeho levelu. 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.

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

Zatím to necháme takto a vylepšíme ho v budoucnu. Také někdy déle 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:

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ženo 35x (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
Článek pro vás napsal Jan Kubice
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Aktivity (6)

 

 

Komentáře

Avatar
josef rajmon
Člen
Avatar
josef rajmon:17. července 17:19

Ahoj kdyz jsem vytvořil ten StalagScript tak mi to začalo vyhazovat chybu (viz obr.)

 
Odpovědět
17. července 17:19
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 1 zpráv z 1.