ITnetwork summer 2020
80 % bodů zdarma na online výuku díky naší Letní akci!
Pouze tento týden sleva až 80 % na e-learning týkající se PHP

Lekce 11 - 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čítač 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?

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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-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
Článek pro vás napsal Jan Kubice
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Aktivity (4)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!