Lekce 10 - Unity (C#) Android: Přestavba, bodáky
V minulé lekci, Unity (C#) Android: MenuPart, Eraser, pozadí 2, jsme vylepšili odstraňování překážek, detekci objektu a přidali levely.
Vítám vás u dalšího Unity3D tutoriálu, kde vytváříme vlastní hru pro Android. Dnes upravíme mapu, pohyb hráče a pozměníme i způsob, jakým se nám posouvají překážky.
Vylepšení particle systému
Nejdříve ale uděláme drobnou změnu v našem Particle Systému, který
jsme si vytvořili pro rozbíjení stalagů. Oproti minule si nastavíme navíc
ještě Start Color, kterou zvolíme modrou. Také Shape změníme na Sphere o
radiusu 2
. A abychom docílili hezčího efektu, aktivujeme
Rotation over Lifetime, malou šipkou napravo zvolíme Random Between Two
Constants a hodnoty nastavíme na -180
až 180
. Tím
zajistíme, aby se nám particly trochu otáčely a nevypadaly tak staticky:
Nová překážka
Začneme úpravou mapy. Aby to hráč neměl tak jednoduché a trochu se u hraní zapotil, přetvoříme si strop, na který přidáme bodáky. Na konci článku zas máte základní grafiku ke stažení. Bodáky si naimportujeme do Unity.
Bodákům dále přidáme collider. Můžeme si zvolit hodně colliderů, přes které to uděláme, ale nám postačí box collider2D. Roztáhneme ho, aby pokrýval celý sprite. Dále také nastavíme Tag na Wall. Vytvoříme si z toho prefab:
Nebudeme chtít, aby se s námi bodáky hýbaly podobně, jako se hýbe mapa. Nevypadalo by to moc hezky, protože by vlastně letěly s námi. Proto je budeme generovat podobně jako stalagy. Nejdříve si bodáky třeba 30x nakopírujeme vedle sebe:
To prozatím stačí. Dále je budeme za Eraserem posouvat zpět za obrazovku, stejně jako pozadí, čímž docílíme nekonečného efektu, i když jich bude stále jen 30.
Úprava pohybu
Nyní si předěláme pohyb hráče. Když hrajeme, kamera i hráč jsou připoutány k sobě a hráč se stále nachází ve středu. To změníme a uděláme, aby se kamera nepohybovala ve směru osy Y, ale pouze po ose X. Docílíme toho tak, že kameru oddělíme od hráče. Také Eraser si oddělíme od hráče pro použití dále:
Skript kamery
Do kamery si přidáme skript CameraFollow
, díky kterému bude
kamera následovat hráče:
public Transform playerRef; public bool withOffset; public int offset; // Update is called once per frame void Update() { Vector3 pos = transform.position; Vector3 newPos = playerRef.position; if (withOffset) newPos.x += offset; newPos.z = pos.z; newPos.y = pos.y; transform.position = Vector3.Lerp(transform.position, newPos, 1f); }
V tomto skriptu nás již nic nepřekvapí kromě funkce Lerp()
.
Tato funkce zajišťuje plynulý pohyb z bodu A do bodu B. Posledním parametrem
říkáme, jak plynule se bude daný objekt posouvat. Jediné, na co nesmíme
zapomenout po dodělání skriptu, je přiřadit hráče do proměnné
playerRef
.
Dále Eraser objektu přidáme také tento skript a za playerRef
přiřadíme také Player. Offset nastavíme podle toho, jak vzadu máme Eraser
na mapě posunutý na ose Y a odškrtneme WithOffset. V mém případě mám
offset nastavený na -25
. Eraseru dále také přidáme
Rigidbody2D, na kterém nastavíme gravitaci na 0 fixneme úhly:
Skript Eraseru
Eraseru dále upravíme skript, aby posouval jak zdi, tak pozadí. Skript tedy bude vypadat následovně:
void OnTriggerEnter2D(Collider2D col) { if(col.CompareTag("Stalag")) { if(col != null) Destroy(col.gameObject); } if(col.CompareTag("Wall") || col.CompareTag("Background")) { col.SendMessage("Move"); } }
Kontrolujeme zde, zda se Eraser setkal se zdí a nebo s pozadím, dle toho daný objekt posune.
Aby nám vše fungovalo jak má, přidáme Prefabu našich bodáků skript
BGMover
a trochu BGMover
poupravíme, aby fungoval pro
náš nový účel. Odmažeme náš TriggerEnter a přidáme tam tuto
metodu:
public int count; void Move() { Bounds b = GetComponent<SpriteRenderer>().bounds; float sizeX = b.size.x; Vector3 pos = transform.position; pos.x += count * sizeX - 10; transform.position = pos; }
Jelikož jsme skript původně používali pouze na pozadí, tak by nám
nefungoval na naši novou překážku, která by se neposouvala o požadovaný
kus. Tudíž si zavádíme novou proměnnou count
, kterou velikost
daného objektu budeme násobit. Tudíž na pozadí tuto hodnotu nastavíme na
2, jak bylo původně ve skriptu a pro bodáky nastavíme 30
,
jelikož jsme si vytvořili 30 kopií bodáků vedle sebe.
Hru můžeme spustit a vyzkoušet.
V příští lekci, Unity (C#) Android: Start, Skóre, PlayerPrefs, se podíváme na počítání skóre při zdolání překážky a také na počkání na startu, dokud hráč nezačne hrát.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkamiStaženo 316x (8.59 kB)