6# Block breaker 2.
Zde se začneme věnovat blokům, jejich barvám a ničení. Stejným způsobem jako budeme upravovat barvy bloku můžeme upravovat i barvy jakéhokoliv jiného objektu a tak můžete změnit barvu míče i pálky.
V hierarchii si rozkliknete blok, a v inspektoru pod sprite render najdete color. Nejedná se přímo z měnu barvy, ale o jejich sčítání. Takže pokud máte obrázek v odstínech šedé můžete jej snadno přebarvovat. Černé části zůstanou černé a bílé budou odpovídat barvě, kterou vyberete. Toto se vám bude hodit i pro plošinovky a další hry, kdy budete chtít různé verze nepřátel a nechcete mít množství modelů. Tak stačí použít černobílý sprite, kterému budete měnit barvy. V našem případe upravujeme zatím barvu jednoho bloku. Já použiji fialovou s ohledem na styl o který se snažím.
Bloku rovnou přidáme script “Break” a začneme pracovat na rozbíjení bloku. Nebudeme potřebovat Start a Update, ale budeme potřebovat spustit script s kolizí (když míč nabourá do bloku). Odstraníme si Start() a Update() a začneme psát script, který se zapne společně s kolizí. Jeden takový jsme již dělali, když nám míč spadne pod pálku a zde použijeme hodně podobný. Opět se bude jednat o private void a funkce s bude jmenovat OnCollisionEnter2D. Visual studio nám samo doplní obsah závorek.
Po kolizi chceme zničit blok (zatím necháme stranou bloky co potřebují více zásahů ke zničení). K tomu budeme potřebovat příkaz Destroy. Ten nechá objekt zmizet do té doby než znovu načteme scénu. Přes Destroy se dá ničit řada objektů nebo jejich prvků/componentů my budeme ničit celý herní objekt.
Nyní by to již mělo fungovat. Ale ještě bych se rád zmínil o obsahu závorek, Collision 2D collision. Do proměnné collison se nám totiž ukládají informace o klizi a budoucnu budeme moct tuto proměnou použít například pro počítání skóre nebo přechodu do dalšího levelu. Zatím nebudeme využívat.
Už by jsme sice mohli vytvořit celý level pomocí kopírování, ale o něco lepší způsob je pomocí vytvořit si Prefab, hlavně pokud pak budete chtít dělat globální změny. Můžeme si na to vytvořit novou složku Prefab. Tím pádem už máme složky Material, Prefab, Scenes a Sprites. Klidně si můžete udělat i složku Scripts a Fonts a třídit si soubory jak chcete, unity se postará o cesty samo. Když si otevřete prázdnou složku Prefab můžeme na základě naší kostky vytvořit první Prefab tak, že přetáhneme Blok z Hierarchie do Assets.
Jak vidíte je to velmi náročné. Nyní když chceme přidat další blok do hry, můžeme jen přesunout blok z Assets > Prefab do scény. V hierarchii snadno poznáte jestli se jedná o Prefab díky modré barvě textu.
Pokud bych měl ve hře již 20-30 bloků a řeknu si, že fialová je špatně vidět, jediné co musím udělat je otevřít si v Assets můj Prefab blok, ve které když změním barvu změní se mi barva všech bloků vytvořených z toho prefabu. Můžu si udělat i další Prefabs ze stejného bloku jen s jinou barvou a pak mohou rychle vytvářet další levely jen skládáním bloků z prefabs do scény. Pokud chcete bloky skládat do čtvercové sítě, stačí u přesouvání držet CTRL. Pokud nechcete použít čtvercovou síť můžete objekty chytat za roh když držíte V a ten se bude přichytávat k dalším rohům.
Nyní můžete v klidu vytvořit první lvl, který by měl fungovat. Zatím hra není dokonalá, míček se nám může zpomalovat a určitě najdeme další problémy. Ale první level postavit můžeme.
Zároveň můžeme si udělat balíky prefabs, pomocí kterých můžeme dělat další levely. Může si udělat balík GameBoard, do kterého si dáme všechny statické věci, kameru, stěny, LoseCollider, pozadí a SceneLoader. Další části si uděláme jako Prefab samostatně a to míč a pálku.
Pro vyzkoušení si můžeme rovnou udělat druhou scénu. V Assets přejděte do složky Scenes, pravé tlačítky myši Create -> Scene. Dáme ji jméno LVL 2 a pomocí Prefabs ji sestavíme. Napřed přetáhneme GameBoard, tím vytvoříme celý základ a pak přidáme Block a postupně rozkopírujeme na celý level. Jediná úprava je, že musíme odstranit kameru, která je automaticky umístěna na nové scéně.
Už nastal i čas opravit zpomalování míčku, kdy nejlepší řešení je dát v Assets -> Materials -> Bounce Friction na 0.
Můžeme dát také dohromady nějaký pěkný zvuk odrazu míčku. Pokud chcete použít můj zvuk můžete si ho stáhnout. Pro použití audia v unity musíme zvládnou použít 3 termíny, Listener, Source a Clip. Audio listener může být třeba kamera nebo naše postava podle toho můžeme vnímat i směr zvuku, audio source je původce zvuku. Pro tuto hru to bude míček. A poslední součást, audio clip, je samotný soubor, který chceme přehrát.
Jako první si ověříme, že naše kamera má audio listener. Je jedno kterou si rozklikneme (LVL 1 nebo LVL 2). Vybereme Cameru v hierarchii a v inspektoru by jste měli vidět Audio Listener.
Jako druhé přidáme míči Audio Source. V hierarchii si ho otevřeme. Přidáme v inspektoru komponent audio source. Zatím necháme prázdné a vytvoříme si v Assets další složku, audio. Zatím máme pouze jedno, ale můžeme časem přidávat další zvuky a hudbu. Do audia přetáhneme zvuk, který pro míč chceme. Může být ve formátu MP3, OGG nebo WAV. Když máme zvuk přidaný vrátíme se do inspektoru míče a hned první položka (AudioClip) je to kam chceme zvuk přidat. Stačí kliknout na malé kolečko vedle řádku a vybrat zvuk. Nyní pokud by jsme pustili hru uslyšíme zvuk hned na začátku jak se hra načte. Je to proto, že máme zaškrtnuto Play On Wake. Ideální pro hudbu na pozadí v kombinaci s Loop. Ne úplně vhodné pro zvuk míčku při narážení. Proto zrušíme.
Třetí krok co nás čeká je ještě zařídit, aby se zvuk přehrál při kolizi. To už v Unity nenastavíme a musíme do Visual Studia a otevřeme si script “Ball”. Podmínku pro spuštění scriptu při kolizi jsme již minimálně jednou dělali a princip je naprosto stejný jako ve scriptu Break. Použijeme funkci OnCollisionEnter2D, která vezme Audio Source component a přehraje ho.
Toto by už mělo fungovat, ale můžeme také přidat variace ke zvukům, aby se jeden zvuk neopakoval stále dokola, ale aby se náhodně pustil jeden ze 3 zvuků. Přidejte si do Assets SpaceClick2 a SpaceClick3. Začneme tím, že si odebere zvuk co jsme si přidali v inspektoru míče (vybereme NONE) a teprve při nárazu vybereme jeden ze zvuků a ten přehrajeme. Zvuky stále musíme nějak připojit a tak se přepneme do Visual Studia a uděláme se serializované pole. Už jich tam pár máme ALE nechceme dělat 3 serializovaná pole pro 3 zvuky uděláme Array. S tou jsme již pracovali u textové adventury a jediný rozdíl při vytváření jsou hranaté závorky na konci typu. Typ, který použijeme bude AudioClip.
Sjedeme úplně dolů a místo začneme upravovat přehrání zvuku. Samotné Play() funguje, ale pokud se spustí znovu ještě než skončí první zvuk (dva nárazy rychle za sebou), první zvuk se přestane přehrávat a začne se přehrávat druhý. Proto upravíme Play() na PlayOneShot(). To by nám mělo zajistit, že i zvuky rychle po sobě se přehrají. Visual Studio by nám ale mělo nyní hlásit error (červené podtržení), Protože PlayOneShot() potřebuje do závorek specifikovat jaký zvuk chceme přehrát, Uděláme si nad tím volný řádek a založíme si proměnnou clip typu AudioClip, do které uložíme náhodný zvuk z Array co jsme si serializovali na začátku. Použijeme pro to funkci Random.Range, u které musíme přidat minumum (0) a maximum. Zatím nevíme kolik zvuků budeme do budoucna chtít přidat a mohou být pouze 3, ale pak najdeme jiný balík zvuků kde jich bude 10 a v ten moment by jsme museli upravovat funkci. Proto je lepší místo konkrétního čísla prostě říct délku Array (ballSounds.Lenght). Do prázdné zvorky u PlayOneShot pak dáme jméno proměnné, do které jsme zvuk uložili “clip”.
Nyní uložíme, přepneme se do unity a v inspektoru míče připojíme naše 3 audio soubory k scriptu.
Hotovo. Minimálně co se zvuků míče týče. Můžeme ještě přidat zvuk bloku při rozbíjení. K tomu ale musíme přistupovat jinak. Blok nám totiž při rozbití zmizí a ne pouze vizuálně. Je úplně odstraněn a s ním by byl odstraněn i zdroj zvuku. Proto existuje PlayClipAtPoint. Jedná se o funkci, která vytvoří zdroj zvuku na místě a po dokončení přehrávání jej odstraní. Budeme tedy potřebovat další zvukový soubor. Opět si ho uložte do složky Audio. Přepneme se do Visual Studia do souboru Break a jako první si vytvoříme Serializované pole pro připojení audia ke scriptu.
Než objekt zničíme musíme přidáme spuštění zvuku. Napřed vytvoříme AudioSource, kterému řekneme, aby přehrál audio na místě (PlayClipAtPoint), do závorky definujeme napřed jaké audio (naše proměnná) a poslední část je náročná, kde má tento zvuk vzniknout. Mohli by jsme ho spustit na místě kde je kostka, ale PlayClipAtPoint je 3D zvuk a naše kamera vnímá ostatní zvuky jako 100% hlasitosti a tím, že by byl tento zvuk dál od kamery byl by tišší než ostatní. Proto necháme přehrát zvuk přímo na kameře, aby hlasitost byla stejná. Aby jsme získali pozici kamery potřebujeme vzít naší Main Cameru a z transform vzít position.
Uložíme, přepneme se do unity, v Assets -> Prefab upravíme náš blok tím že přidáme do script audio a máme hotovo.
0 Comments