11. diel - Unity (C #) Android: Vylepšenia pohybu nakláňaním
V minulej lekcii, Unity (C #) Android: Štart, Skóre, PlayerPrefs , sme sa pozreli na počítač skóre pri zdolanie prekážky a tiež na počkanie na štarte, kým hráč nezačne hrať.
Dnešné lekcie bude kratšia, upravíme si tu postavu hráča a urobíme ju krajší pohyb. Presnejšie zaistíme, aby sa náš drak nakláňal podľa smeru letu. Tým pridáme ďalší element do našej hry a tým pádom bude vyzerať aj živšie.
Oprava sekanie
Na začiatok si ale opravíme jednu vec. Pokiaľ máte v skripte
CameraFollowPlayer
metódu FixedUdate()
, odporúčam
ju premenovať na Update()
. S metódou FixedUpdate()
je možné, že sa pohyb kamery bude kosiť. Je to z toho dôvodu, že sa táto
metóda volá vždy v pevne daný časový úsek, zatiaľ čo metóda
Update()
sa volá čo najčastejšie to ide. Keďže sa
Update()
stíha vykonávať omnoho častejšie, tak nám zaistí
plynulý pohyb postavy.
Pohyb
A môžeme ísť na lepší pohyb! Otvoríme si skript
PlayerMoveScript
a na úplný koniec si pridáme metódu
RotateMe()
:
RotateMe(float y)
{
}
Túto metódu budeme volať na konci metódy Update()
. V pláne
je, aby sa naše postavička nakláňala podľa rýchlosti po osi Y. Do metódy
budeme odovzdávať velocity (rýchlosť) nášho hráča ako parameter. Ale
prečo sa volá len y
?
Keď si uvedomíme, že chceme iba velocity po jednej osi, môžeme trochu náš kód sprehľadniť a urobiť krajšie. Namiesto toho, aby sme odovzdávali velocity celé, budeme do parametra dávať iba jeho ypsilonovou hodnotu.
Aby sme vôbec vedeli, aké hodnoty rýchlosti máme a mohli podľa nich
pekne natočiť hráča, necháme si ich prvýkrát vypísať. To urobíme na
samotnom konci Update()
metódy. Pridáme teda na koniec metódy
print(vel)
a budeme sledovať, čo nám dotyčná riadok bude
vypisovať pri hraní:
Z vypisovaných hodnôt sme zistili, že najvyššia hodnota, ktoré
dosiahneme, je 6
a najmenší -11
. Podľa týchto
hodnôt sa budeme riadiť. Teraz si ideme zariadiť náš sklon.
Ak nie ste moc oboznámenie s vektormi, tak máme vypisované
hodnoty v tomto tvare (0.0
, 0.0
, 0.0
),
kde prvé číslo znamená rýchlosť v osi X, druhé v osi Y a posledný v osi
Z. V 2D priestore nás tretia rýchlosť nezaujíma.
Vďaka zisteným hodnotám sa budeme riadiť podľa toho, či y
je menšia ako 0
alebo väčšia ako 0
(resp. Či
letíme dolu alebo hore). Keď poletíme hore, bude sa postavička pozerať pred
seba:
if (y >= 0) { transform.rotation = Quaternion.Euler(0, 0, 0); }
Nastavíme rotáciu objektu na nulovú. Quaternion je záležitosť z 3D
grafiky a pre nás nie je veľmi dôležité jej riešiť čo a ako robí. Len
nám postačí, že má metódu Euler()
, ktorá prevádza z uhlov.
Nastavíme teda 0
, 0
, 0
, čo znamená,
že poletíme rovno. Nulové hodnoty nastavujeme, pretože chceme, aby sa
postava hráča pri lete hore narovnala a pozrela pred seba.
Teraz musíme spočítať uhol, o ktorý sa chceme otočiť. S tým nám
pomôže metóda Lerp()
matematické knižnice. Táto metóda
obmedzí akúkoľvek hodnotu, v našom prípade uhol, medzi dve zadané hodnoty.
Ak y
bude napr. 100
, obmedzí nám ho na číslo medzi
0
až -70
. Zvolili sme -70
z toho
dôvodu, že pri padaní chceme hráča otočiť o -70
stupňov
smerom dole:
if (y >= 0) { transform.rotation = Quaternion.Euler(0, 0, 0); } else { float angle = Mathf.Lerp(0, -70, -y); }
Potom nastavíme rotáciu 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); }
Ak projekt teraz spustíme, bude sa diať presne čo chceme, ale nebude to
pekné, pretože sa nám otáčania deje instantne. Preto to urobíme plynulým
pohybom. Už vieme, že na to môžeme použiť Lerp()
. Riadok s
rotáciou upravíme na:
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 0, angle), 0.05f);
Určite najviac mätúce je metóda Lerp()
. Raz
slúži pre nejaké uhly a raz pre plynulý pohyb. Ako je to možné?
Dôležité je si všimnúť toho, že jedna metóda pochádza z triedy
Quaternion
a druhá metóda z Mathf
. Fungujú však
podobne. Lerp()
pomaly otáča danou rýchlosťou, až sa zastaví
na maximálnom uhle, za ktorý už nejde.
To je pre tento kratučký diel všetko. Dúfam, že neboli žiadne problémy a všetko šlo hladko.