9# Block breaker 5.

Začneme opravou našeho skóre z předchozí lekce. Použijeme pro to techniku zvanou Singleton, který by měla zaručit, že se nám nepřepíše proměnná nulou pokud je již vytvořena. Na kontrolu toho jestli je vytvořena musíme použít speciální funkci Awake(). Již známe funkce Start() a Update(), které používáme prakticky v každé třídě. K tomu ale ještě patří pár dalších funkcí, které postupně budeme používat. Pokud použijeme Awake, to co je její součástí bude spuštěno jako první po načtení scény. Přesné pořadí si můžete prohlédnout zde. Pro nás ta důležitá informace Awake je ještě před Start().

Budeme upravovat třídu GameStatus.cs, ve které se skóre pracujeme. Vytvoříme zde novou funkci Awake() – private void.

Nyní přijde část Singleton. Náš script se po načtení každé scény snaží vytvořit novou proměnou scoreGame. Technicky zůstává i ta původní, ale je používána ta nová pro tu danou scénu. Pokud zajistíme, že se má zničit nově vytvořená proměnná a stará bude zachována zůstane nám i skóre mezi jednotlivými levely. Napřed zjistíme kolik už máme vytvořených objektů GameStatus. Pokud jich máme víc než jeden zničíme ho, ale pokud máme pouze jeden uděláme ho nezničitelným.

Ještě nemáme úplně vyhráno. Pokud by jste nyní hru zkoušeli zjistíte, že skóre se obnovuje ještě hůř než předtím. Jde o to, že náš GameStatus se snaží psát do jednoho konkrétního textu, který je součástí prvního levelu. Když se dostaneme do druhého spojení již nefunguje. Musíme tedy vzít Canvas a přesunout ho pod GameStatus. Zároveň pak můžete odstranit Canvas z ostatních stránek, protože nebude již potřeba a bude se nám přesouvat mezi stránkami. Aktuálně ho máme jako součástí prefab GameBoard. Musíme kliknout na šipku vedle GameBoard. Přetáhnout Canvas do Assets -> Prefab. Odstranit Canvas z GameBoard a opět ho vložit do scény pod GameStatus.

Poslední detail, který musíme opravit se týká pořadí podle, ve kterém se pouští jednotlivé příkazy. Destroy je zrovna ten, který se pouští jako poslední. Proto musíme přidat jeden kouzelný řádek, kterým nám zaručí, že než zničíme tento objekt, neudělá jinde problémy. gameObject.SetActive(false).

Hotovo skóre opraveno. Možná až moc 😀 Naše skóre se totiž nemaže ani potom co prohrajeme/dohrajeme hru. To, že jsme před chvíli řekli neničit po načtení, neznamená, že ho nemůžeme zničit, kdy se nám bude chtít. Vytvoříme si novou veřejnou funkci. Nazveme ji removeScore a její jediný obsah je Destroy(gameObject);. Stále píšeme do GameStatus.cs

 

A zde by šlo více řešení v jaký moment tuto funkci volat. Šlo by ji volat hned jak hráč prohraje, nebo při načtení scény GameOver, ale nejlepší řešení je, aby se skóre mazalo až v tu chvíli, kdy hráč začne hrát znovu, lépe řečeno, až když hráč řekne, že chce načíst úvodní obrazovku LoadStartScene(). Tuto funkci máme ve SceneLoader.cs a již jsme několikrát volali funkci z jiné třídy a ani tentokrát to není jiné.

Hotovo a skóre je kompletní a funkční. V další lekci, částicové efekty po rozbití bloku!

 

 

0 Comments

Submit a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Share This