IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

Tvorba 2D arkády pro Android v Unity

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


 

Předchozí článek
Unity (C#) Android: Start, Skóre, PlayerPrefs
Všechny články v sekci
Tvorba 2D arkády pro Android v Unity
Přeskočit článek
(nedoporučujeme)
Unity (C#) Android - Healthbar 1
Článek pro vás napsal Jan Kubice
Avatar
Uživatelské hodnocení:
2 hlasů
Aktivity