Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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í:

Tvorba 2D arkády pre Android v Unity

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-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.


 

Predchádzajúci článok
Unity (C #) Android: Štart, Skóre, PlayerPrefs
Všetky články v sekcii
Tvorba 2D arkády pre Android v Unity
Preskočiť článok
(neodporúčame)
Unity (C #) Android: MenuPart, Eraser, pozadia 2
Článok pre vás napísal Jan Kubice
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity