26.jan: Input, kretanje, sudaranje sa drugim objektima (Collision2D)
Čisto informativno, u sledećem video snimku je navedeno kako sve objekat može da se kreće, u 3D igrama :
( pogledajte video, bez obzira što ovako nećemo raditi u narednim lekcijama jer je kod nas naglasak na 2D igrama )
Zadatak br.1:
- Kreirati 2D projekat. U njega dodati dva kvadrata (2D Object - Sprites - Square). Jedan kvadrat će biti naš "Player" pa mu dajte to ime i postavite ga negde u gornju polovinu scene. Drugi kvadrat će biti tlo ispod na koji će igrač da padne. Njemu
postavite ime na "Ground".
( Ako ste dodali objekte na ovaj način, onda oni već imaju komponentu SpriteRenderer, osim početne Transform komponente.) - Kvadrat "Ground" izmenite tako da pokriva donji deo scene: smanjite visinu, povećajte širinu tako da sada imate uzani pravougaonik. Promenite mu boju u zeleno.
- Oba objekta treba da imaju komponentu BoxCollider2D - dodajte im je.
- Objektu "Player" dodajte i komponentu RigidBody2D.
- Kreirajte C# skriptu i nazovite je Kretanje. Da biste uneli programski kod otvorite skriptu u editoru.
- Napomena:
- Ovaj primer radimo sa VS Code. Trebalo bi minimalno da u njemu imate dodatke : C#, Unity Toolbox, i Unity Code ako želite da vam radi i Intelisense za predlaganje šta bi moglo da se unese sledeće. Ako želite i Debug opciju, dodajte adekvatnu komponentu.

- U vašoj skripti dodajte lokalne promenljive u kojima će da se smesti komponenta igrača RigidBody2D jer ćemo njega da pomeramo, i promenljive u kojima će se nalaziti brzima kretanja i brzina skakanja.
Rigidbody2D PlayerRigidBody;float PlayerSpeed;float JumpSpeed;
- Ove brzine će biti postavljene prilikom pokretanja igre, kao što će i RigidBody2D komponenta biti preuzeta prilikom pokretanja igre. ( u prevodu: u metodi Start())
void Start(){PlayerRigidBody = GetComponent<Rigidbody2D>();PlayerSpeed = 10.0f;JumpSpeed = 5.0f;}
- U metodi koja se poziva za svaku frejm biće proveravano koji je taster pritisnut i na osnovu toga će se menjati RigidBody2D.velocity:
void Update(){if(Input.GetKey(KeyCode.RightArrow)){PlayerRigidBody.velocity = transform.right * PlayerSpeed;}if(Input.GetKey(KeyCode.LeftArrow)){PlayerRigidBody.velocity = -transform.right * PlayerSpeed;}if(Input.GetKey(KeyCode.UpArrow)){PlayerRigidBody.velocity = transform.up* JumpSpeed;}}
Rad sa klasom Input:
Klasa Input se do sada koristila za prihvatanje određenih akcija kao što su klik miša ili pritiskanje nekog tastera na tastaturi.
U opštem slučaju, mogu da se koriste razne vrste uređaja za unos (input), kao što su kontroleri, džojstici, tastatura, miš, VR, AR, kao i mikrofon i web kamera. Zasada se koncentrišemo na unos putem tastature, miša ili džojstika.
Za kreiranje virtualnih osa kretanja, dugmića kojima se kreće koristićemo Input Manager. Tu može da se podese opcije po želji. Pronalazite ga u Edit->Project Settings->Input Manager.
Ako radite iz skripte, virtualnim osama pristupate navodeći njihova imena.
Svaki projekat prilikom kreiranja ima postavljene neke podrazumevane virtualne ose:
- Horizontal i Vertical su mapirani da koriste w, a, s, d i tastere sa strelicama.
- Fire1, Fire2 su mapirani na Crtl, Alt
- ...
Ako želite da promenite početna podešavanje za igricu, u Input Manageru odaberete virtualnu osu i u njoj postavite Positive Button - za kretanje u pozitivnom smeru i Negative Button - za kretanje u negativnom smeru, kao i Alt Positive Button - alternativno
dugme ili taster za kretanje u pozitivnom smeru i Alt Negative Button - alternativno dugme za kretanje u negativnom smeru.
Metode klase Input:
Da biste proverili da li je pritisnut neki taster ili dugme na mišu koriste se statičke metode klase Input od kojih su neke: GetKey(), GetKeyDown(), GetKeyUp(), GetButton(), GetButtonDown(), GetButtonUp(), GetMouseButton(), .....
GetKey (ovo smo koristili u primeru)
Svi tasteri na vašoj tastaturi imaju neki KeyCode. Pa ako želimo da znamo da li je pritisnut taster W, možemo da koristimo na primer:
if(Input.GetKey(KeyCode.W)) .....
Savet je da se radi sa KeyCode, iako bi trebalo da se može raditi i ako se samo navede naziv tastera koji se koristi:
if(Input.GetKey("W")) .....
Da bi bilo zgodnije, postoje i kodovi za miša KeyCode.Mouse0 (Mouse0 - levi taster, Mouse1-desni taster, Mouse2 - klik na točkić.
Postoji i GetKeyDown - on će da uradi samo jednom kad se pritisne taster. Za razliku od njega, GetKey će raditi stalno dokle god je taster pritisnut (razlika između pucanja mitraljezom i puškom).
Razmislite koji od njih biste koristili i kada.
Postoji i GetKeyUp - neće odraditi dokle god se ne otpusti taster, a tada će odraditi samo jednom.
Dodatak 1: Input klasa, detaljno, sa propertijima i metodama : https://docs.unity3d.com/ScriptReference/Input.html
Dodatak 2: Koji sve kodovi postoje možete pogledati na https://docs.unity3d.com/ScriptReference/KeyCode.html
Dodatak 3: Pogledajte ovaj video kod kuće:
Zadatak 2: ispratite primer koji je na video snimku
Zadatak 3 (2.čas):
Kreirati igricu (Pong)
Za bolje učenike koji žele da znaju više:
U nastavku je link ka uputstvu kako da se kreira slična igrica ali na malo složeniji način, korak po korak, (i to na engeskom jeziku):