09.02 - Lekcija
Šta radimo: " Рад са класом Time. Рад са променљивом Time и deltaTime. Напредно кретање играча – ротација и скакање. "
Klasa Time u sebi ima određen broj propertija koji se koriste kad god nam treba nešto što ima veze sa vremenom.
Opis svih možete naći u Scripting Referencama (Time script reference page): https://docs.unity3d.com/ScriptReference/Time.html
Na primer:
- Time.time vraća koliko je vremena prošlo od početka igranja vašeg projekta.
- Time.deltaTime vraća koliko je vremena proteklo otkako je kompletiran poslednji frejm
- Time.timeScale predstavlja koliko brzo vreme prolazi. Podešavanjem ove vrednosti se na primer može stvoriti efekat slow-motion
- . . .
Šta je u stvari vreme (engl.time) u Unity-ju?
To je brojčana vrednost koja je jednaka broju sekundi koje su protekle od početka igranja igre. Vrednost je tipa 'float', što znači da dobijate tačno vreme uključujući i deo sekunde
koji trenutno prolazi, umesto diskretnih celih vrednosti u sekundama.
Šta je Unity predstavljeno sa deltaTime?
deltaTime je jednostavno vreme u sekundama između poslednjeg frejma i trenutnog frejma.
Pošto se Update poziva jednom po frejmu, ako na primer u metodi Update() koristimo
obj.transform.position += new Vector3(offset, 0, 0);
tada će se obj pomerati u smeru x-ose u svakom frejmu, bez obzira na to koliki je FPS (broj frejmova po sekundi).
Međutim, ako umesto toga upotrebimo:
obj.transform.position += new Vector3(offset * Time.deltaTime, 0, 0);
tada znamo da će se obj pomerati ravnomernom brzinom, bez obzira na FPS.
Zašto je to tako?
Renderovanje i izvršavanje skripti zahteva neko vreme. To može da se razlikuje za svaki pojedinačni frejm. Ako želite da imate FPS reda oko
60 fps, vrlo verovatno nećete imati stabilan fps, već će se to razlikovati s vremena na vreme. Ako imate dosta brz komp, možda vam to neće smetati, ali ne možete da izbegnete renderovanje ako ste prespori.
Da bi se izašlo na kraj sa različitim
brzinama za različite frejmove, koristi se "Time.deltaTime".
U metodi Update() to će da prikaže koliko je sekundi proteklo da bi se obradio poslednji frejm (obično nešto kao 0.00123).
Ako treba da pomerite objekat od tačke A do tačke B, možete upotrebiti sledeći kod:
object.transform.position += Vector3.forward * 0.05f;
Ovim će se pomerati 0.05 jedinica (Units) po frejmu. Nakon 100 frejmova pomeraj je 5 jedinica (Units).
Na nekim računarima ova igra recimo može da radi na 60fps, na drugim možda na 144 hz. Plus framerate nije konstantno. Tako da će našem objektu trebati 1-5 sekundi za prelazak ovog rastojanja.
Međutim, ako uradite sledeće:
object.transform.position += Vector3.forward * 5f * Time.deltaTime;
sada će se pomerati 5 jedinica u 1 sekundi. Nezavisno od broja frejmova u sekundi.
Znači: Ako želite da se nešto pomera nekom konstantnom brzinom, pomnožite tu brzinu sa Time.deltaTime !
Zadatak 1: Da se podsetimo kako se igrač kreće, a koristimo Time.deltaTime (isključite zvuk, ispratite video uputstvo):
Zadatak 2: u igri postaviti pravougaonik koji će biti na dnu kao tlo. Na njega postavite objekat igre: igrača u obliku kvadrata (ili možete da opciono upotrebite neki sprajt umesto kvadrata). Za vašeg igrača kreirajte skriptu u koju ćete ubaciti sledeće:
public float speed = 10.4f;
void Update()
{
Vector3 pos = transform.position;
if(Input.GetKey("w"))
{
pos.y += speed * Time.deltaTime;
}
if(Input.GetKey("s"))
{
pos.y -= speed * Time.deltaTime;
}
if(Input.GetKey("d"))
{
pos.x += speed * Time.deltaTime;
}
if(Input.GetKey("a"))
{
pos.x -= speed * Time.deltaTime;
}
transform.position = pos;
}
Proverita kako igra radi. Šta će se desiti ako promenite brzinu? Šta će se desiti ako umesto Time.deltaTime koristite Time.time ? Proverite !
Pokušajte da dodate i rotaciju konstantnom brzinom oko z-ose, tako što ćete ispred Update dodati public promenljivu:
public float degreesPerSecond = 2.0f;
a unutarUpdate-a dodajte deo za rotaciju:
transform.Rotate(0, 0, degreesPerSecond * Time.deltaTime);
Zadatak 3: Umesto prethodne skripte, sada ćemo da radimo sa komponentom RigidBody2d i da se kreće i da skače.
Igraču dodajte RigidBody2D i kolajder, a podlozi dodajte BoxCollider2D i nakon toga ispratite video:
Nakon lekcije je postavljen link ka tutorijalu za igricu "Flappy bird" - mada u ovom tutorijalu leti ribica.
Pokušajte da uradite igricu kod kuće.