Lekce 12 - Unity (C#) Android: Vylepšení pohybu nakláněním
V minulé lekci, Unity (C#) Android: Start, Skóre, PlayerPrefs, jsme se podívali 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.
Dnešní lekce bude kratší, upravíme si zde postavu hráče a uděláme ji hezčí pohyb. Přesněji zajistíme, aby se náš drak nakláněl podle směru letu. Tím přidáme další element do naší hry a tím pádem bude vypadat i živěji.
Oprava sekání
Na začátek si ale opravíme jednu věc. Pokud máte ve skriptu
CameraFollowPlayer metodu FixedUdate(), doporučuji ji
přejmenovat na Update(). S metodou FixedUpdate() je
možné, že se pohyb kamery bude sekat. Je to z toho důvodu, že se tato
metoda volá vždy v pevně daný časový úsek, zatímco metoda
Update() se volá co nejčastěji to jde. Jelikož se
Update() stíhá provádět mnohem častěji, tak nám zajistí
plynulý pohyb postavy.
Pohyb
A můžeme jít na lepší pohyb! Otevřeme si skript
PlayerMoveScript a na úplný konec si přidáme metodu
RotateMe():
RotateMe(float y)
{
}
Tuto metodu budeme volat na konci metody Update(). V plánu je,
aby se naše postavička nakláněla podle rychlosti po ose Y. Do metody budeme
předávat velocity (rychlost) našeho hráče jako parametr. Ale proč se
jmenuje jen y?
Když si uvědomíme, že chceme pouze velocity po jedné ose, můžeme trochu náš kód zpřehlednit a udělat hezčí. Místo toho, abychom předávali velocity celé, budeme do parametru dávat pouze jeho ypsilonovou hodnotu.
Abychom vůbec věděli, jaké hodnoty rychlosti máme a mohli podle nich
hezky natočit hráče, necháme si je prvně vypsat. To uděláme na samotném
konci Update() metody. Přidáme tedy na konec metody
print(vel) a budeme sledovat, co nám dotyčná řádka bude
vypisovat při hraní:

Z vypisovaných hodnot jsme zjistili, že nejvyšší hodnota, které
dosáhneme, je 6 a nejmenší -11. Podle těchto
hodnot se budeme řídit. Nyní si jdeme zařídit náš sklon.
Pokud nejste moc obeznámení s vektory, tak máme vypisované
hodnoty v tomto tvaru (0.0 , 0.0 , 0.0),
kde první číslo znamená rychlost v ose X, druhé v ose Y a poslední v ose
Z. Ve 2D prostoru nás třetí rychlost nezajímá.
Díky zjištěným hodnotám se budeme řídit podle toho, jestli
y je menší než 0 nebo větší jak 0
(resp. jestli letíme dolů nebo nahoru). Když poletíme nahoru, bude se
postavička koukat před sebe:
if (y >= 0) { transform.rotation = Quaternion.Euler(0, 0, 0); }
Nastavíme rotaci objektu na nulovou. Quaternion je záležitost z 3D grafiky
a pro nás není moc důležité jí řešit co a jak dělá. Jen nám
postačí, že má metodu Euler(), která převádí z úhlů.
Nastavíme tedy 0, 0, 0, což znamená,
že poletíme rovně. Nulové hodnoty nastavujeme, protože chceme, aby se
postava hráče při letu nahoru narovnala a koukla před sebe.
Nyní musíme spočítat úhel, o který se chceme otočit. S tím nám
pomůže metoda Lerp() matematické knihovny. Tato metoda omezí
jakoukoli hodnotu, v našem případě úhel, mezi dvě zadané hodnoty. Pokud
y bude např. 100, omezí nám ho na číslo mezi
0 až -70. Zvolili jsme -70 z toho
důvodu, že při padání chceme hráče otočit o -70 stupňů
směrem dolů:
if (y >= 0) { transform.rotation = Quaternion.Euler(0, 0, 0); } else { float angle = Mathf.Lerp(0, -70, -y); }
Poté nastavíme rotaci objektu:
if (y >= 0) { transform.rotation = Quaternion.Euler(0, 0, 0); } else { float angle = Mathf.Lerp(0, -70, -y); transform.rotation = Quaternion.Euler(0, 0, angle); }
Pokud projekt nyní spustíme, bude se dít přesně co chceme, ale nebude to
hezké, protože se nám otáčení děje instantně. Proto to uděláme
plynulým pohybem. Již víme, že k tomu můžeme použít Lerp().
Řádek s rotací upravíme na:
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 0, angle), 0.05f);
Určitě nejvíce matoucí je metoda Lerp().
Jednou slouží pro nějaké úhly a jednou pro plynulý pohyb. Jak je to
možné? Důležité je si všimnout toho, že jedna metoda pochází z třídy
Quaternion a druhá metoda z Mathf. Fungují ovšem
podobně. Lerp() pomalu otáčí danou rychlostí, až se zastaví
na maximálním úhlu, za který už nejde.
To je pro tento kraťoučký díl vše. Doufám, že nebyly žádné problémy a vše šlo hladce.
V příští lekci, Unity (C#) Android - Healthbar 1, do naší arkády přidáme healthbar.

