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.