11# Block breaker 7.
V unity se běžně používají tagy. Umístěním samotného tagu nic neuděláme je to něco jako třída v CSS. Dokud ji nedáme pravidla nic nebude dělat. Tagy v unity pak můžeme aplikovat ve scriptech. A jak jsem slíbil. Začneme nerozbitným blokem. Otevřeme si Assets Prefab a v nich jakýkoliv blok. V inspektoru hned po názvem by jste měli vidět “Tag: Untagged”.
Mezi tagy najdeme nějaké základní jako Respawn, Finish a Player. My si ale vytvoříme nový pomocí posledního řádku Add Tag. Otevře se nám nabídka Tags and Layers. Klikneme na + u Tags – List is empty. Vytvoříme rovnou dva tagy. Breakable a Unbrekable.
Nyní si v Assets vybereme prefab Block označíme ho tagem Breakable. K tomu můžeme vytvořit i nový prefab Na základě původního bloku. Pokud máte v Assets označený původní blok, můžete udělat CTRL + D (Duplikovat) a tím vytvoříte kopii. Té doporučuji změnit barvu na šedivou a hlavně přepnout tag na Unbreakable. To že jsme si bloky označili Tagy samozřejmě nic neznamená. Ještě musíme udělat úpravy v kódu.
Otevřeme si Break.cs a v něm musíme část věcí schovat do podmínky. Podmínkou samozřejmě bude “pokud má blok tag breakable” a budeme dávat do ni vše co máme v OnColliksionEnter2D, Protože nechceme hráči dávat skóre, nechceme přehrát animaci, nechceme zvuk rozbití a už vůbec nechceme blok rozbít pokud je blok unbreakable.
Zde je jediná věc, která může být pro někoho nová a to jsou ==. Jedno = se používá pokud chceme hodnotu přiřadit. Dvě = se používají pokud chceme hodnoty porovnat a pokud přidáme vykřičník (např. tag !== “Unbreakable”) chápeme jako “pokud se nerovná”)
Toto však nebude jediná úprava. Aktuálně nerozbitné bloky se nám přidávají do seznamu bloků, které máme v aktuálním levelu a hra by nás nepustila dál, dokud nerozbijeme všechny bloky (i ty nerozbitné) a to by byl samozřejmě problém. Proto musíme ještě upravit Start(). V něm počítáme bloky co jdou rozbít (level.CountBreakableBlocks) Tento řádek se nesmí spustit pokud je blok unbreakable nebo ještě lépe, pouze pokud je breakable.
Druhá část, aby bloky potřebovali více zásahů na zničení jednoho bloku. Budeme opět pracovat v Break.cs. Vytvoříme si serializované pole, ve kterém budeme nastavovat kolik zásahů blok potřebuje a ještě budeme potřebovat proměnnou kolik zásahů aktuálně blok již má.
Nyní opět budeme upravovat OnCollisionEnter2D. Zde musíme napřed udělat část, která bude přidávat počet zásahů a pokud jich je počet daný v maxHits blok se zničí. To ale znamená, že se náš OnCollision začíná dost plnit a nemuselo by to být tak přehledné. Proto by bylo ideální udělat si refaktoring. Označíme se vše v podmínce a uděláme z toho vlastní funkci DestroyBlock() – Rychlé akce a refaktoring -> Extrahovat metodu.
Práce teď bude o něco přehlednější. Pokud je blok zničitelný, přidáme jeden bod zásahu a pak podmínkou zjistíme jestli počet zásahů je stejný nebo větší než maximální počet zásahů, pokud ano zničíme blok.
Zatím hráč neví, jak moc je blok poškozený. To je krok č. 3 v této lekci. Opět budeme pracovat v Break.cs a přidáme si serializované pole. Tím připojíme různé stavy rozbití bloku, které již máme ve Sprites. Aby jsme jich mohli připojit více najednou použijeme pole (Array). Pole se značí hranatými závorkami a jeho typ bude Sprite. Pojmenovat jej můžeme hitBlockSprites.
Sprite bloku budeme chtít měnit po zásahu v případě, že není zničen. Takovou podmínku již máme prakticky celou vytvořenou v OnCollisionEnter2D. Zde stačí připsat ELSE. Else je druhá část pro podmínku IF. V našem případě se bude jednat o “Pokud již byl blok zasažen tolikrát aby mohl být zničení, znič blok. V opačném případě změn sprite na více zničený blok.”
Pro lepší představu co budeme upravovat, vyplatí se kouknout nyní do Unity. Zde si klikněte na libovolný blok v hierarchii a v inspektoru by neměl být problém najít kde je připojen sprite bloku.
Pro nás jsou zde dva důležité názvy Sprite Renderer a Sprite. Ty použijeme v kódu. Přepneme se zpět do Visual Studia a použijeme GetComponent, kterým vezmeme Sprite Renderer a jeho část Sprite. Ten nahradíme položkou z naší Array hitBlockSprites.
Toto by nám částečně fungovalo. Po prvním zásahu by se změnil Sprite na první co máme v Array. Pokud ale chceme více než jednu změnu musíme nahradit 0 proměnnou a tu postupně zvětšovat s každým zásahem. Počítání zásahů již máme a máme ho uložený v hitsTaken. Z této proměnné můžeme vycházet jen ji nemůžeme přímo dosadit místo nuly. Array totiž začíná od nuly a zásahy budou počítány od 1. Naštěstí jednoduché řešení -1 bude fungovat.
Uložíme a přepneme se do Unity. Zde nás čeká prakticky poslední úprava. V Assets -> Prefab si otevřeme Blok a v části “Break (Script)” musíme říct, kolik budeme mít připojených Sprite a pak je připojit. Pokud chcete, aby byly potřeba 3 zásahy nastavíte Max Hit na 3, Size na 2 a připojíte oba další Sprites pro blok. Pokud chcete 2 zásahy nastavíte Max Hit na 2, Size na 1 a připojíte pouze více zničený blok.
Drobný detail, který se vám mohl stát. Pokud se vám blok zvětšil nebo zmenšil po zásahu otevřete si Assets -> Sprites a u bb1 a bb2 si nastavte stejný Pixel Per Unit jako máte u bb0.
V dalším díle upravíme otravné smyčky co se nám mohou vyskytnout, jako například kdy nám míč lítá zprava doleva ve stejné výšce a my nemůžeme nic dělat.
0 Comments