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:
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 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:
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š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:
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:
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:
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
:
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ínkamiStaženo 393x (11.74 kB)