Pomeranje objekta kodom i stapanje animacija - Unity tutorijal

Pomeranje objekta kodom i stapanje animacija - Unity tutorijal

offline
  • Pridružio: 14 Feb 2008
  • Poruke: 12118

Radim na jednoj 2.5 D igri za Android i koristiću je da napišem koji interesantni tutorijal ovde.

Podeliću tutorijal na dva dela :
1. Za totalne početnike od uvoza modela, podešavanja teksture ...
2. Za naprednije korisnike koji znaju da podese scenu sami i uvuku modele - koje interesuje samo kod

Indeks :
1. Uvlačenje potrebnih fajlova, podešavanje njihovih postavki i postavki okruženja
1.1 Otvorite Unity i napravite novi projekat sa 2D okruženjem.
1.2 Uvlačenje modela kog ćemo koristiti i podešavanje opcija
1.3 Dodavanje tog modela na scenu i podešavanje rotacije i materijala
1.4 Podešavanje kamere
2. Animiranje
2.1 Animator
2.2 Podešavanje logičkih parametara u Animatoru
2.3 Konekcija između animacija
3. Programiranje
3.1 Deklarisanje promenljivih
3.2 Pomeranje
3.3 Pristupanje kodom Animatoru, slanje i očitavanje parametara

Ovaj tutorijal će vas naučiti :
- kako da uvezete model i teksturu
- da podesite materijal modela
- da izmenite ime gameObject-a i lokaciju/rotaciju/scale
- kako radi Child-Parent konekcija između gameObject-a
- kako da napravite jednostavne animacije rotiranja
- kako da u animatoru napravite konekcije između klipova animacije i stopite ih
- kodom pomerite objekte na sceni po jednoj ili više osa
- kodom pristupite komponentama
- kodom pristupite drugom gameObject-u i njegovim komponentama
- kodom pristupite parametrima animatora

Evo šta je zamisao :
Imamo jedan objekat na sceni kog uvek prati kamera. Želimo da omogućimo igraču da pomera taj objekat na sceni dok drži taster na tastaturi. Iako je ovo android projekat, možda neko ko čita tutorijal nema android da proba kod pa ćemo stoga koristiti tastaturu za ulaz ovog puta.

Kada korisnik pritisne taster D, objekat će se kretati desno.
Kada korisnik pritisne taster A, objekat će se kretati levo.
Kada korisnik pusti bilo D ili A, objekat će potpuno stati i neće se kretati.

Uzevši u obzir da je ova igra smeštena negde na moru, gde je igrač vozač podmornice, moramo da mu omogućimo da pomera podmornicu gore i dole.
Međutim ja ne želim da ovaj deo kontrola uradim na isti način kao kretanje levo i desno.
Radije ću imati jedan slajder na ekranu koji će imati tri režima :

1. podmornica ide gore
2. podmornica miruje
3. podmornica ide dole

Opet ćemo ovde improvizovati i koristićemo tastaturu.
Kada igrač pritisne taster S naš slajder će otići jedan broj dole, kada pritisne taster W, otići će jedan broj gore i tako ćemo kontrolisati mirovanje/potapanje i izlaženje na površinu.

Ova igra će, kao i većina standardnih, imati animacije koje će pratiti sve ovo.
Prvobitna verzija tutorijala je trebala da koristi samo tri animacije i da vas nauči kako da ih iskoristite za suprotnu stranu. Međutim trenutno postoji bug u aktuelnoj verziji Unity-ja pa smo primorani da radimo klasično.

Trebaće nam sledeće animacije :

- Animacija mirovanja podmornice desno i levo
- Animacija kretanja podmornice desno i levo
- Animacija okretanja podmornice desno i levo

Te animacije ćemo napraviti u Unity-ju i koristićemo Unity-jev animator kako bi podesili uslove stapanja animacija.

Stapanje animacija znači da dok se, na primer, podmornica kreće desno i koristi animaciju broj 2 može lepo i dinamično preći u animaciju broj 3.
Ukoliko ne bi koristili animator, dok podmornica koristi animaciju broj 2 odmah bi prestala da je koristi i podmornica bi prešla u animaciju broj 2 iste sekunde kada je pozovemo kodom.

Uh, tona teksta ! Zašto ? Jer mislim da je jako bitno da shvatite šta ćemo raditi dalje. Bitno je razumeti kod.

Ok, da krenemo !

1. Uvlačenje potrebnih fajlova, podešavanje njihovih postavki i postavki okruženja

1.1 Otvorite Unity i napravite novi projekat sa 2D okruženjem.
Sačekaće vas prazan interfejs.

Ja već imam sklopljenu scenu sa placeholder komponentama, međutim vama će trebati samo podmornica.

[url=https://www.mycity.rs/must-login.png podmornicu[/url]

- Raspakujte ovaj zip i videćete dva fajla :
Podmornica1.fbx i
MetalAirfract0050_1_S.jpg - teksturu koju sam pokupio sa cgtextures-a

Model izgleda loše no to je potpuno nebitno, kod i animacije koje primenimo na njemu ili čak najobičnijoj kocki možemo da primenimo na bilo kom drugom modelu - na primer onom koga ispoliramo za konačnu verzjiu igre.

1.2 Selektujte oba fajla i prevucite ih u desnu (assets) kolonu Project kartice u Unity-ju. Nakon što Unity uvuče fajlove, dobićete prikaz sličan ovom:






Kada kliknete na stavku "Podmornica1" pogledajte desno u Inspector karticu :



U zavisnosti od vaših podešavanja, [i]Inspector kartica može biti bilo gde u prozoru Unity-ja[/i]

Primetićete da postoje mnoge opcije za uvučeni predmet.
Trenutno nas interesuje "Scale factor" opcija, koja će kod vas verovatno biti "0.1". Promenite vrednost ovog polja na "1" a zatim kliknite na dugme "Apply" u istoj kartici.

1.3 Prevucite model "Podmornica1" u bilo "Scene" ili "Hierarchy" karticu.



Gde god da prevučete istu ona će se pojaviti u obe kartice.

Primetićete da je vaša podmornica bela za razliku od moje koja koristi ovu teksturu. To se dešava jer još uvek niste podesili materijal. Kliknite na strelicu pored podmornice levo u Hierarchy a zatim selektujte "Sphere". Prevucite sphere unos van "Podmornica1" a zatim obrišite "Podmornica1". Radimo ovo jer sam ja loše eksportovao ovaj model pa je pokupio iz blendera još 2 komponente koje nam ne trebaju. Dakle sada smo izvukli "Sphere" iz "Podmornica1". Kliknite na Sphere i preimenujte je u "Podmornica" (na ss-u obeleženo crvenom strelicom).

Zatim pogledajte niže u Inspector kartici, vidite materijal "MetalAircraft0050_1_S". Isto tako niže levo u "Assets" kartici vidite teksturu "MetalAircraft0050_1_S". Prevucite ovu teksturu u kvadratić obeležen zelenom strelicom na SS-u :




1.3.1 Uzevši u obzir da podmornica sada "gleda" u vas, moramo da je rotiramo da se prilagodi 2D pregledu. Kliknite na "Podmornica" unos u "Hierarchy" listi i desno u inspektoru u polju za Y rotaciju upišite -90, u polju za Z rotaciju 180.

Podmornica je sada rotirana i "gleda" u desnu stranu.
Ukoliko je kod vas osa podešena drugačije, nije bitno, izmenite rotaciju tako da je podmornica okrenuta na desnu stranu.



1.4 Podešavanje Kamere Child-Parent konekcijama

Želimo da kamera prati podmornicu stalno. Ovo možemo da uradimo u Unity-ju na lak način tako što ćemo podesiti "Parent" - "Child" konekciju između kamere i podmornice.

Da objasnim kako ovo radi :

Ukoliko imam jedan prazan objekat na sceni koji se zove Podmornica1 i njegov pod objekat bude kamera, kad god pomerim objekat "Podmornica1", kamera će to pratiti. Ukoliko načinim podmornicu podobjektom kamere, podmornica će pratiti pomeranje kamere koja prati pomeranje praznog objekta "Podmornica1".
Dakle lista ovako izgleda :

Podmornica1
-- Kamera
---- Podmornica (Pravi model podmornice)

Kad god pomerim podmornicu1, pomeram sve njene podobjekte.
Zašto bih ovo radio a ne ovako nešto :
Podmornica
-- Kamera

Jer na ovaj način mogu da imam više slobode sa onim što prikazujem.

Kliknite na meni GameObject > Create Emtpy.
Hiearchy kartica sada ima "GameObject" unos. Preimenujte ga u "Podmornica1".



Prevucite unos "Main Camera" na "Podmornica1", zatim "Podmornica" na "Main Camera", tako da dobijete ovakav izgled :



Dakle, sada kada pomerim bilo gde "Podmornica1", njegovu lokaciju prate Main Camera čiju lokaciju prati Podmornica.

2. Animacije

Trebaće nam sledeće animacije :
1. Podmornica miruje desno
2. Podmornica miruje levo
3. Podmornica se kreće desno
4. Podmornica se kreće levo
5. Podmornica se okreće levo
6. Podmornica se okreće desno

Njih možemo lako da napravimo uz pomoć Animation prozora.
Kada su duplikati levo/desno u pitanju, možemo da dupliramo animaciju i samo izmenimo jednu osu.

Kliknite na Windows > Animations i pojaviće se novi prozor na interfejsu.

Zatim kliknite na "Podmornica" i u animation prozoru kliknite bilo na "Add Curve", Dugme za snimanje ili strelice pored "Sample 60" natpisa, gde će se pojaviti "Add new clip".
Sve navedene stavke će uraditi isto : Kreiraće novu animaciju za taj objekat.

Ja sam kliknuo na "Add Curve" i u novom prozoru sam nazvao animaciju "Idle" te je sačuvao :


Nakon toga izaberite Transform > Rotation i kliknite na plusić pored njega.


Primetićete da su dugme "Play / Pause / Next" u gornjem delu, kao i dugme za snimanje, promenili boju. Ovo znači da bilo koju akciju da uradite u editoru sada ova animacija ima da je snimi.

Prvo što ću uraditi je pomeranje ova dva keyframe-a daleko desno. Kada se završi animacija želim da moja podmornica bude na istom mestu gde je počela animacija.


Između ću dodavati nove keyframe-ove rotiranjem podmornice. Selektujte vreme i jednostavno pomerite objekat u Scene prozoru.



Svakog trenutka možete pregledati animaciju klikom na dugme "Play" u Animation kartici.

Napravite vašu animaciju. Iako generalno idle animacija treba biti mirna, ja sam završio sa malo agresivnijim pomeranjem :



Uverite se da uvek obrišete "Position", sem ukoliko želite da vaša animacija na istom mestu ostavi objekat. Mi ne želimo pa ćemo da ga obrišemo. Ukoliko ga ne bi obrisali, svaki put kada bi pozvali ovu animaciju Unity bi pomerio celu podmornicu na početak "sveta".



Kliknite na "Record" dugme da isključite snimanje a potom kliknite na "Idle" pa "Create new clip"



Sačuvajte novu animaciju i istom metodom napravite preostale dve animacije. Dakle treba nam sada animacija kada se podmornica kreće napred i animacija kada se podmornica okreće, bilo levo ili desno..

Ovako izgledaju moje animacije :




Takođe, sada trebate da imate tri klipa kada selektujete podmornicu :



Pogledajte ponovo u Assets karticu, pronađite bilo koju od ove tri animacije, zatim desni klik na nju > Show in Explorer.
Otvoriće se Windows Explorer sa lokacijom gde se nalaze animacije.



Duplirajte sve tri animacije u exploreru :



Možete odmah da ih preimenujete.
Ja jesam moje i tako sam završio sa :
Idle
IdleLeft
Submarine1Forward
Submarine1ForwardLeft
SubmarineLeftTurn
SubmarineRightTurn

Sada se vratite nazad u Unity koji će nakon par sekundi "blokade" ažurirati nove animacije.

Uzevši u obzir da su u pitanju iste animacije moramo da izmenimo drugu kopiju u Animation kartici.

Kako bi se uopšte pojavile ove nove animacije moramo da ih dodamo prvo u Animator.
Selektujte "Podmornica", u Inspector kartici ćete videti komponentu "Animator". Kliknite na "Sphere"
Bitno : Kod mene je ovde "Sphere", kod vas može biti "Podmornica" ili nešto treće.




Kada kliknete na taj unos pojaviće se u Assets kartici žuto obeleženi "Sphere" (ili "Podmornica"). Kliknite na njega i u Animator kartici ćete videti sve animacije koje ste spakovali do sada.

Kao što je obeleženo crvenim strelicama, prevucite duplirane animacije u Animator prozor. Ukoliko ne vidite Animator prozor, kliknite na Window > Animator.

Sada će vam se svih šest animacija prikazati kada kliknete na narandžasto obeleženi kvadratić.

Izaberite jednu po jednu dupliranu animaciju i izmenite je na taj način da podmornica gleda u suprotnu stranu.

Kako možete uraditi ovo ?
Na primer, kod mene :
Animacije "Idle" ima Y rotaciju : 261 na prvom keypoint-u
Animacija "IdleLeft" ima Y rotaciju : 88 na prvom keypoint-u

Sve što sam uradio je kliknuo na svaki od keypoint-a i izmenio Y rotaciju tako da podmornica gleda u suprotnu stranu.






Dakle, sve ostalo je isto samo sam Y osu prilagodio novoj animaciji.
To sam uradio za svaki keypoint na toj animaciji, kao i za preostale dve animacije.
Krajnji rezultat su kopije animacija koje su prvobitno namenjene desnoj strani, sa promenjenom Y osom koje su sada prilagođene levoj strani.

2.1 Animator
Već sam ranije objasnio zašto koristimo animator. Dakle pored toga što kodom možemo kontrolišemo tok animacija, Animator stapa animacije i omogućava nam da ih obradimo upotrebom stringova, booleana itd.

Kliknite na meni Window > Animator. Pojaviće se novi prozor u Unity-ju. Prevucite ga gde vam je pogodno i kliknite na "Podmornica" u Hierarchy kartici.

Trebali bi u Animator kartici da vidite šest animacija sada.
Kliknite na jedan od njih i u inspector kartici ćete videti par opcija.
Hajde da ih preimenujemo kako bi nam bilo lakše, ukoliko već niste.
Animacije sa podmornicom desno :
Idde
Forward
TurnLeft

Animacije sa podmornicom levo :
IdleLeft
ForwardLeft
TurnRight





Ukoliko bi tako imenovali klipove animacije dok smo ih pravili u sekciji "2" ne bi morali da radimo ovo.

Sada ćemo da podesimo logičke konekcije između ovih animacija.

2.2Podešavanje logičkih parametara u Animatoru

Možemo da se poslužimo Integerom, Booleanom, Floatom ili Trigger-om kako bi napravili konekciju između animacija.
Pogledajte prethodni screenshot.

Hajde da objasnimo ovo :

U suštini ovaj deo je logičko postavljanje uslova prilikom čega će doći do stapanja animacija.
Recimo da imam brzinu podmornice kao float.

Kada podmornica miruje taj float je 0.0
Kada se podmornica pomera taj float neće biti jednak nuli. -> Usled toga, da bi se kretala podmornica taj float mora biti veći od 0.1.
To uzimam kao moj uslov da promenim animaciju sa mirovanja u kretanje.

Pogledajte prethodni screenshot, videćete obeleženo "Parameters" polje, kliknite na plusić do njega i selektujte iz liste "Float".

Sada u Parameters listi postoji unos "New Float", kliknite na naziv i preimenujte ga u "Speed" ili "Brzina", ili nešto treće. Imajte u vidu da ćemo pristupiti ovom Floatu kasnije kroz kod prilikom pomeranja.

Vrednost Speed float-a neka ostane 0.0

Mi svejedno imamo još jednu animaciju - okretanje.
Da bi se podmornica okrenula u mojoj igri moram da ispunim dva uslova. Prvi od njih je da "Speed" float bude 0.0, što znači da se podmornica neće kretati u tom trenutku i drugi parametar će mi trebati da znam kada da okrenem podmornicu.

Taj drugi parametar će nam biti Boolean.

Kliknite ponovo na plusić i selektujte Bool, zatim ga preimenujte u "Turn_Left", "Okret_Left" ili nešto treće. Opet, pristupićemo ovom parametru kodom kasnije pa je poželjno da je nešto lako.

Dodaćemo još jedan parametar :
Turn_Right koji je takođe boolean




2.3 Konekcija između animacija

Poslednji deo u animatoru podrazumeva konektovanje između animacija.

Na prethodnom screenshotu vidimo sve naše animacije. Jedna od njih je narandžasta, jedna "Any State" je otvoreno plava, dok su druge sive.

Narandžasta animacija je animacija koja će biti standardna i uvek će raditi. Možemo promeniti standardnu animaciju desnim klikom na neku sivu a potom iz menija izaberemo stavku "Set as default". Nova animacija će postati standardna animacija.
Svejedno, nama je "Idle" animacija animacija mirovanja i stoga ona treba biti standardna. Iz nje želimo da proizvedemo sve ostale animacije. Stoga, ukoliko Idle animacija nije narandžasta, desni klik na nju i "Set as default".

"Any State" Znači da animacije koje konektujem na nju mogu da se dese iz bilo koje druge animacije.
Na primer, zamislimo da imamo čoveka koji hoda i trči a može da čučne. Trčajne može da se aktivira iz animacije hodanja, međutim čučanj se može aktvirati bilo da čovek trči ili hoda sporo. Da ne bi ponavljali uslove i konektovali čučanje za obe animacije, možemo da je konektujemo na "Any State" i na taj način igrač može iz bilo koje animacije da pozove animaciju čučanja.

No, nazad na našu podmornicu.

Setimo se šta smo ranije rekli.
Ukoliko animacija mirovanja ("Idle") bude aktivirana, podmornica se neće kretati uopšte.
Kada igrač pritisne D na tastaturi, podmornica će početi da se kreće desno, pri čemu želim da pomerim animaciju iz "Idle" u "Forward".

Prvo ćemo podesiti ove logičke konekcije u Animatoru a kasnije im pristupiti kodom.

Kliknite na "Idle" animaciju desnim klikom i iz menija izaberite "Make transition". Zatim kliknite na "Forward" animaciju. Videćete strelicu koja je spojila ove dve animacije. Kliknite na nju i u Inspectoru sa desne strane ćemo dobiti nove mogućnosti.



Obratite pažnju na "Conditions" karticu.
Ovde možemo da podesimo parametre koje želimo.
Dakle, da bi animacija kretanja podmornice "Forward" bila aktivirana, mora da se ispuni uslov da je Speed promenljiva veća od 0.1.

Kliknite na "Exit Time" i iz menija izaberite promenljivu koju smo ranije napravili "Speed":
Pored nje će se pojaviti novi combo box sa izborima "Greater" i "Less".
Neka greater bude izabran, jer želimo da uslov to i bude. Zatim u poslednjem polju napišite "0.1".




Dakle, da sumiramo, napravili smo tranziciju između Idle i Forward animacije. Da bi se tranzicija desila mora da se ispuni uslov da je Speed promenljiva veća od 0.1.

Sada, kada bih testirao ovo, tj. hajde da testiramo odmah, pogledajte ovaj gif :



Dakle, na početku igre animacija Idle se ponavlja jer je Speed 0.0. Pomeranjem speed parametra na 0.2 animacija je odmah prešla u Forward animaciju.

Međutim, kada bih vratio sada parametar Speed na 0.0, animacija bi ostala još uvek Forward, to je zbog toga što nismo namestili povratnu tranziciju.

Kliknite na Forward animaciju desnim klikom i iz menija izaberite "Make transition" a potom selektujte "Idle" animaciju. Pojavila se nova strelica koja ukazuje da smo napravili povratnu tranziciju.
Klikom na strelicu podesite uslov : Speed promenljiva je manja od 0.1.



Ostala je još jedna animacjia za desnu stranu : Okret.

Kako bi se podmornica okrenula u mojoj igri, igrač mora da uspori. Pri tome će animacija biti idle a "Speed" parametar 0.0.
Desni klik na "Idle", pa iz menija izaberite "Make transition" a zatim selektujte "TurnLeft".
Kliknite na novu strelicu koja se pojavila između njih i podesite sledeće uslove :
Turn_Left mora biti "true"
Speed mora biti manji od 0.1
Time smo završili rad na desnoj strani podmornice. Ovako izgleda animator :



Sada ćemo da završimo ostatak "kola" animacija. Dakle, kada podmornica stoji i igrač pritisne taster A, podmornica će ući u "Left_Turn" animaciju ! Nakon što se ova animacija završi, želim da podmornica pređe u IdleLeft animaciju.

Desni klik na "Left_Turn", izaberite 'Make transition' a zatim selektujte "IdleLeft" animaciju.
Selektujte novu strelicu koja se pojavila i podesite sledeće parametre :
Turn_left bool = false - ne želimo da taj bool bude više aktiviran jer je animacija završena
Speed float manji od 0.1 - želimo da podmornica miruje
Exit Time - 0.90 - ovo je novi parametar koji će sačekati da animacija dođe pred određeno vreme pre nego što pređe dalje. Ovo nam treba jer je turn animacija nešto sporija i želimo da se odigra bar 90% pre nego što animacija pređe u idleleft.



Dakle, sada je podmornica u animaciji mirovanja i gleda levo ! Sada treba da napravimo novu tranziciju kretanja levo.

Desni klik > Make transition > Izaberite ForwardLeft animaciju. Kliknite na novu strelicu tranzicije i podesite sledeće parametre :
Speed > Less > -0.1

Desni klik na "ForwardLeft" > Make transition > IdleLeft, ponovo kliknite na novu tranziciju i podesite parametre :
Speed > Greater > -0.1


Na kraju, iz IdleLeft animacije želimo da napravimo okret animaciju za desnu stranu.
Desni klik na Idle Left > Make Transition, selektujte novu strelicu između ove dve animacije i podesite parametre :

Turn_Right > True
Speed > Greater > -0.1
Exit Time > 0.75

Desni klik na "TurnRight" animaciju, Make transition pa selektujte Idle. Kliknite na strelicu tranzicije i kao uslov postavite :
Exit Time > 0.90.

Ovako izgleda finalni Animator :



Time smo završili sa Animatorom za sada.
Možete da testirate sve parametre tako što ćete kliknuti na "Play" dugme a zatim menjate parametre u levoj donjoj ivici Animator kartice.

3. Programiranje

Postoji ogroman broj načina na koje možemo da pomerimo objekat kodom unutar Unity-ja.
Ja ću koristiti jednu lošiju metodu za objekat koji igrač pomera. Lošija je zbog toga što može doći do provlačenja kroz statične objekte (Podmornica prođe kroz zid npr.). Mi nismo koristili gotove kontrolere i pakete jer želimo sami da naučimo kako da pomeramo objekte.

Stoga, ne preporučujem upotrebu ovog koda za pomeranje nečega što igrač kontroliše, već za nešto u pozadini što ima isplanirani tok kretanja.

Za pomeranje možete da koristite fiziku, character controller componentu ili već gotovu asset skriptu.

No, da se vratimo našem pomeranju.

Skripte u Unity-ju rade ovako :
Svaki kod koji pišem u skripti se odnosi direktno na GameObject na koji se stavi.
Bilo bi suludo da imamo milion skripti koje komuniciraju jedna sa drugom i stoje na svakom objektu. Stoga moramo da napravimo komunikacije između skripti ili objekata i skripti.
Postoji par načina da se ovo uradi a ja ću vam pokazati jedan od lakših i meni praktičnijih.

Znamo već da se u Inspektoru prikazuju sve promenljive koje definišemo u skripti. Isto tako mogu da deklarišem novi GameObject i on će se prikazati u inspektoru.

Kako ćemo kod da obradimo ?

Želim da pomeram sve skupa (onaj prazni gameobject) pa ću pomeranja direktno vršiti na Podmornica1 gameobject-u.
Animacije ću kontrolisati direktno na našoj podmornici uz pomoć animatora.

Ova skripta će biti okačena na podmornicu i pristupiće Podmornici1 i animatoru odatle.

3.1 Deklarisanje potrebnih promenljivih
Desni klik u Assets karticu > Create Javascript
Nazovite je Movement i otvorite je u omiljenom editoru. Ja koristim standardni MonoDevelop.

Vaša skripta izgleda ovako :
#pragma strict function Start () { } function Update () { }

Setite se, Update funkcija se izvršava svakog frejma a nekada i više puta, logično je da ovde želimo da koristimo kod za pomeranje, međutim kako bi u velikom gotovom projektu tu već bio ogroman broj loma, kako bi olakšali nama, napravićemo novu funkciju za kretanje koju ćemo samo pozvati unutar Update funkcije.

function Kretanje () { }

Dodajte ovu liniju koda ispod Update funkcije.

Sada vaša skripta izgleda ovako :
#pragma strict function Start () { } function Update () { } function Kretanje () { }

OK! Hajde da deklarišemo promenljive koje ćemo koristiti.

Prvo, rekli smo da želimo da pomeramo ceo prazni objekat Podmornica1. Kako je ova skripta "zakačena" na Podmornicu moramo da pristupimo Podmornici jedan nekako.

Dodajte liniju odmah ispod "#pragma strict" :

var Podmornica : GameObject;

Sačuvajte skriptu, prevucite je na objekat "Podmornica" i u inspektoru ćete videti novu promenljivu "Podmornica". Kliknite na kružić obeležen strelicom a zatim iz desnog prozora izaberite "Podmornica1".




Rekli smo da će onaj slajder za kontrolisanje da li podmornica tone, izranja ili miruje. Koristićemo int :
var sliderpos : int ;

Želimo takođe da kontrolišemo brzinu potapanja i izranjanja pa ćemo da deklarišemo float :

var downspeed = 0.5;

Trebaće nam i jedna promenljiva kojom ćemo pratiti brzinu podmornice :
var moveSpeed = 0.5;

Na kraju, kako bi pristupili animatoru moramo da deklarišemo još jednu promenljivu :

 var animator : Animator ;

Vaš kod bi trebao da izgleda ovako :

#pragma strict var Podmornica : GameObject; // Podmornica celokupni GameObject var sliderpos : int ; // Pozicija slidera 0 - 1 - 2 var downspeed = 0.5f; // Brzina potapanja var moveSpeed = 0.5f; // Brzina kretanja podmornice var animator : Animator ; function Start () { } function Update () { } function Kretanje () { }

Ukoliko pogledamo Inspector sada dok je Podmornica selektovana, videćete sledeći prizor :



Ok, time završavamo deklarisanje i krećemo, konačno, da pomerimo ovu starudiju !

3.2 Pomeranje

Da bi pomerili ovaj objekat, koristićemo transform.Translate
Na linku imate objašnjenje koje parametre prima i šta radi.

Takođe ćemo koristiti Time.deltaTime koji će nam pomoći da naša igra uvek radi isto na svim mašinama. Ukoliko to ne bi učinili, igra bi pomerala podmornicu različito od FPS-a do FPS-a na različitim konfiguracijama. Kako su igre koje zavise od FPS-a mnogo mnogo loša stvar, mi ćemo se držati standarda Smile

No, da se vratimo nazad kodu.

Sada ćemo pisati u funkciji Kretanje. Rekli smo da ćemo improvizovati kontrole pa ćemo tako prvo proveriti da li igrač drži taster A na tastaturi :

function Kretanje () { if (Input.GetKey (KeyCode.A)) { // ukoliko drži primenićemo pomeranje u levu stranu Podmornica.transform.Translate(Vector3 (0, 0, -moveSpeed) * Time.deltaTime); } } }

Međutim dok god ne pozovemo funkciju Kretanje unutar Update funkcije, ništa se neće desiti. Stoga dodajte Update funkciji ovu liniju koda :
function Update { Kretanje () ; }
Sačuvajte skriptu, pokrenite igru i pritisnite taster A. Podmornica se kreće levo.
Hajde da analiziramo kod čas :

Podmornica
// Deklarisali smo je na početku i u Inspektoru prevukli gameObject. To znači da sada direktno kontrolišem sledeći parametar tog gameObject-a

Podmornica.transform
// Pristupam transform komponenti

Podmornica.transform.Translate
// koristim translate koji sam linkovao iznad, on ima par verzjia parametara koje prima. Ja mu šaljem Vektor 3 u nastavku koda koji stoji za 3D lokaciju u svetu

Podmornica.transform.Translate (Vector 3(0,0,-moveSpeed) * Time.deltaTime
Prvi parametar je Vector 3 koji ima tri parametra : tri ose (X Y Z, ne striktno po tom redosledu).
Mi želimo da pomerimo podmornicu levo pa nas interesuje samo poslednja osa. Stavljamo minus da naznačimo da se krećemo u suprotnom smeru.

Umesto da sam stavio kao poslednji parametar -0.5 ili nešto drugo, ja sam stavio -moveSpeed jer tako mogu direktno da kontrolišem brzinu podmornice menjanjem te promenljive.

Na kraju, koristimo Time.deltaTime koji će se postarati da naša igra radi uvek isto bez obzira na FPS i druge uslove.

No, postoje skraćenice koja ja nisam namerno koristio :
Vector3.back = Vector3(0, 0, -1).
Vector3.down = Vector3(0,-1,0)
Vector3.forward = Vector3(0,0,1)
Vector3.left = Vector3(-1,0,0)
Vector3.one = Vector3(1,1,1)
Vector3.right = Vector3(1,0,0)
Vector3.up Vector3(0,1,0)
Vector3.zero Vector3(0,0,0)

Sada ćemo iskopirati kod i promeniti parametre za taster D :

function Kretanje () { if (Input.GetKey (KeyCode.D)) { Podmornica.transform.Translate(Vector3(0,0,1)*  Time.deltaTime); } } } }

Ovde sam kao poslednji parametar koji prima Vector3 napisao "1". Mogao sam da napišem "moveSpeed" Umesto 1 i tako kontrolišem kretanje napred tj. brzinu istog. Mogao sam da deklarišem novu promenljivu koja će biti zadužena za sporije kretanje nazad itd. ali nisam.
Razlika je očigledna : Tokom kretanja ne mogu da izmenim kod i podmornica će se uvek kretati napred brzinom od 1f.

Pokrenite projekat ako ste sačuvali skriptu i probajte da pomerate podmornicu. Kada se krećete nazad ona će ići duplo sporije nego kada se kreće napred, jer je napred brzina uvek 1 dok brzinu za nazad možemo da promenimo menjanem promenljive moveSpeed.

Svakako, tokom testiranja igre u inspektoru možete da menjate parametre, samo imajte u vidu : sve izmene koje se dese dok se testira projekat se neće sačuvati.

Taj kod pokriva pomeranje levo i desno, hajde da isprogramiramo Y osu tj. potapanje, izranjanje i mirovanje.

Vaša skripta bi trebala da izgleda ovako :

#pragma strict var Podmornica : GameObject; // Podmornica celokupni GameObject var sliderpos : int ; // Pozicija slidera 0 - 1 - 2 var downspeed = 0.5f; // Brzina potapanja var moveSpeed = 0.5f; // Brzina kretanja podmornice var animator : Animator ; function Start () { } function Update () { Kretanje () ; } function Kretanje () { // LEVO if (Input.GetKey (KeyCode.A)) { Podmornica.transform.Translate(Vector3(0,0,-moveSpeed)*  Time.deltaTime); } // DESNO if (Input.GetKey (KeyCode.D)) { Podmornica.transform.Translate(Vector3(0,0,1)*  Time.deltaTime); }

3.2.1 Potapanje, izlazak na površinu i mirovanje

Za razliku od prethodnih kontrola gde igrač drži A i D da se kreće (ili strelice na androidu), igra će koristiti drugačiju šemu - igrač će pomerati slajder koji ima tri režima : mirovanje, potapanje, izlazak na površinu.

Mi ćemo improvizovati za tastaturu ponovo. Za razliku od prethodnog koda, ovde želim da pomerim režim slajdera samo kada korisnik pusti taster. Razlog je to što se nekada update funkcija pozove više puta u jednom frejmu i može napraviti problem.

Odmah ispod poslednje linije koda u Kretanje funkciji, dopišite sledeći uslov :

if (Input.GetKeyUp (KeyCode.S)) { if (sliderpos == 0 ) { sliderpos = 1; } else if (sliderpos == 1) { sliderpos = 2; } }

Dakle, ukoliko igrač pritisne i pusti taster S, vršimo dodatnu proveru, u slučaju da je int vrednost promenljive sliderpos 0 pomeramo je na 1, ukoliko je 1 pomeramo je na 2.

Ispod ovog koda obrađujemo ove podatke pomeranjem :

if (sliderpos == 0) { Podmornica.transform.Translate(Vector3(0,downspeed,0)*  Time.deltaTime); } if (sliderpos == 1) { Podmornica.transform.Translate(Vector3(0,0,0)*  Time.deltaTime); } if (sliderpos == 2) { Podmornica.transform.Translate(Vector3(0,-downspeed,0) * Time.deltaTime); }

Dakle, većina koda je ista. Razlika je u tome što koristimo drugu promenljivu - downspeed, drugi parametar za Vector3 i što će ovaj kod da se pozove u zavisnosti od sliderpos promenljive a ne igračevog držanja dugmeta.

Još samo da obradimo šta se desi kada igrač pusti taster W :
if (Input.GetKeyUp (KeyCode.W)){ if (sliderpos == 2) { sliderpos = 1; } else if (sliderpos == 1){ sliderpos = 0; } Debug.Log (sliderpos);

Skripta sada izgleda ovako :

#pragma strict var Podmornica : GameObject; // Podmornica celokupni GameObject var sliderpos : int ; // Pozicija slidera 0 - 1 - 2 var downspeed = 0.5f; // Brzina potapanja var moveSpeed = 0.5f; // Brzina kretanja podmornice var animator : Animator ; function Start () { } function Update () { Kretanje () ; } function Kretanje () { // LEVO if (Input.GetKey (KeyCode.A)) { Podmornica.transform.Translate(Vector3(0,0,-moveSpeed)*  Time.deltaTime); } // DESNO if (Input.GetKey (KeyCode.D)) { Podmornica.transform.Translate(Vector3(0,0,1)*  Time.deltaTime); } if (Input.GetKeyUp (KeyCode.S)) { if (sliderpos == 0 ) { sliderpos = 1; } else if (sliderpos == 1) { sliderpos = 2; } } if (Input.GetKeyUp (KeyCode.W)){ if (sliderpos == 2) { sliderpos = 1; } else if (sliderpos == 1){ sliderpos = 0; } Debug.Log (sliderpos); if (sliderpos == 0) { Podmornica.transform.Translate(Vector3(0,downspeed,0)*  Time.deltaTime); } if (sliderpos == 1) { Podmornica.transform.Translate(Vector3(0,0,0)*  Time.deltaTime); } if (sliderpos == 2) { Podmornica.transform.Translate(Vector3(0,-downspeed,0) * Time.deltaTime); }

Tim smo upravo napravili jednostavno pomeranje. Ostaje nam još samo da kažemo Animatoru kako da se ponaša u određenim situacijama kako bi ukloipili animacije.
Ovo je samo jedan od načina na koji možemo da rešimo animiranje. Mogli smo takođe direktno da povežemo brzinu animacije sa brzinom podmornice i ostavili Animatoru da sam odradi posao. To je slučaj kod Rig-ova humanoida u Unity-ju i radi odlično.

3.3 Pristupanje, slanje parametara i očitavanje parametara Animatora

Nisam hteo namerno da guram ovaj kod u prethodni deo kako ga ne bih iskomplikovao.
Hteo sam da razdvojim pomeranje od animatora kako bi lakše shvatili šta se dešava.

Pre svega moramo da imamo jednu promenljivu koju ćemo deklarisati kao animator.

Dodajte novu liniju koda ispod #pragma strict linije :
var animator : Animator ;

Nakon toga u funkciju start upišite sledeći kod :
animator = GetComponent("Animator");

Ovaj kod radi isto ono što bi se desilo da smo prevukli Animator komponentu u Inspektor-u samo što će to uraditi na početku skripte. Treba obratiti pažnju, ovaj kod će samo raditi ako je skripta zakačena za gameObject koji ima komponentu Animator. Kod nas je skripta prikačena direktno za model podmornice pa neće biti problema.

Sada kada smo napravili konekciju između nove promenljive i animatora možemo direktno da mu pristupimo. Nas interesuju parametri. Njih možemo da očitamo i izmenimo.
Kontrolisanje parametra se vrši sledećim kodovima na sledeći način ;
Levo je upotreba, desno primer :

animator.SetFloat("ime_parametra", vrednost); animator.SetFloat("Speed", 0.2); animator.SetBool("ime_parametra", vrednost);  animator.SetBool("Okret", true); animator.SetInteger("ime_parametra", vrednost); animator.SetInteger("Life", 1);

Dakle, u ovoj fazi mi smo već podesili sve uslove u Animatoru i sve što ostaje je da obradimo kodom te parametre tokom igre. Ja ću vam pokazati vrlo jednostavnu upotrebu koja je samim tim i prosta.
Ima par problema; na primer :
- animator mora biti u određenoj animaciji kako bi prepoznao sledeći unos a to podrazumeva da igrač pritisne taster ponovo tokom te animacije

Međutim mislim da će to poslužiti za ovu našu svrhu - da naučimo kako da izmenimo parametre tokom igre.

Moraćemo da napravimo par izmena u našem kodu.
Trebaće nam još jedan uslov i novi bool.

Deklarišite novi bool i nazovite ga "levo"
var levo = false ;

Zatim pogledajte ovaj kod :

function Kretanje () { // LEVO if (Input.GetKey (KeyCode.A)) { Podmornica.transform.Translate(Vector3(0,0,-moveSpeed)*  Time.deltaTime); } // DESNO if (Input.GetKey (KeyCode.D)) { Podmornica.transform.Translate(Vector3(0,0,1)*  Time.deltaTime); }

Prvo ću popraviti kretanje desno i umesto trećeg parametra za Vector3, staviću "moveSpeed" promenljivu, jer će sada podmornica da se okrene i želim da bude brzina ista ...

if (Input.GetKey (KeyCode.D)) { Podmornica.transform.Translate(Vector3(0,0,moveSpeed)*  Time.deltaTime); }


Dalje, kada korisnik drži A želim da "levo" bool bude "true", kako bih mogao da razdvojim kasnije jedan deo koda vezan za taster D.


// LEVO if (Input.GetKey (KeyCode.A)) { levo = true ; Podmornica.transform.Translate(Vector3(0,0,-moveSpeed)*  Time.deltaTime); }

I sada dodajem sledeći kod :
animator.SetFloat("Speed", 0.0); animator.SetBool("Turn_Left", true); yield WaitForEndOfFrame ; animator.SetBool("Turn_Left", false); yield WaitForEndOfFrame ; animator.SetFloat("Speed",-0.2);

Linija po liniju :
Podešavam "Speed" na 0.0
Podešavam "Turn_Left" na true.
Ukoliko je moja igra u stanju animacije Idle ta animacija će odmah prepoznati promenu parametara i ući će u animaciju okretanja levo.
Kako pozivam ovu funkciju u Update funkciji, koja može da se pozove više puta, koristim yield :
yield WaitForEndOfFrame;
Yield je komanda koja će zaustaviti tok koda u zavisnosti od postavljenog uslova. Uslov ovde je da se završi frejm.
Dalje, igra je sada ušla u animaciju okretanja i odmah stavljamo Turn_Left parametar na false .
Ponovo čekam da se završi frejm.
Animacija je sada već u Idle_Left stanju, odakle nameštam parametar "Speed" na -0.2 kog će odmah Forward left animacija prepoznati i aktiviraće se.

Na kraju, kada igrač pusti taster A moramo da zaustavimo podmornicu i pređemo u animaciju "Idle", stoga ću dodati odmah ispod celokupne If grane :

else { if (levo){ animator.SetFloat("Speed", 0.0); } }

Ovde koristim bool levo koji smo ranije deklarisali u skripti. Zašto ? Pritisak na taster D će takođe imati ovaj "else" uslov, međutim kako se ovaj kod provlači kroz Update koji izvršava kod nekada više puta, kad god bi D ili A bilo u "slobodnom" stanju tj. ne pritisnuto, ovaj kod bi se izvršavao i vraćao speed na 0.0. Dakle, sve što ovde radimo je dodatna provera koja će zaustaviti neželjeno ponašanje.

Kod izgleda ovako sada :

// LEVO if (Input.GetKey (KeyCode.A)) { levo = true ; Podmornica.transform.Translate(Vector3(0,0,-moveSpeed)*  Time.deltaTime); animator.SetFloat("Speed", 0.0); animator.SetBool("Turn_Left", true); yield WaitForEndOfFrame ; animator.SetBool("Turn_Left", false); yield WaitForEndOfFrame ; animator.SetFloat("Speed",-0.2); } else { if (levo){ animator.SetFloat("Speed", 0.0); } }

Isti deo koda vezan za animator kopiram u upit za taster D, stim što ću samo promeniti parametre pa će izgledati ovako :

// DESNO if (Input.GetKey (KeyCode.D)) { levo = false ; Podmornica.transform.Translate(Vector3(0,0,moveSpeed)*  Time.deltaTime); animator.SetFloat("Speed", 0.0); animator.SetBool("Turn_Right", true); yield WaitForEndOfFrame ; animator.SetBool("Turn_Right", false); yield WaitForEndOfFrame ; animator.SetFloat("Speed", 0.2); } else { if (!levo){ animator.SetFloat("Speed", 0.0); } }

Sa svim izmenama, pokrenite igru i dobićete ovaj rezultat :



Time završavamo ovaj glomazni tutorijal.
Kao što sam rekao na početku, ova metoda je daleko od sjajne metode. Ne preporučuje se za kretanje "igrač" objekata jer može dovesti do problema prilikom sudaranja sa predmetima.

Međutim naučili ste da podesite osnovne parametre u Animatoru, da ih kontrolišete kodom, da pomerate gameObject na sceni i još tonu stvari vezanih za uvlačenje i podešavanje modela u inspektoru. Sa ovim znanjem možete da napravite dosta kul stvarčica.

Za sve ostale informacije o svakom deliću koda kog sam napisao u ovom tutorijalu imate zvaničnu stranicu Unity endžina za Boo, JS i C#.

Iako ovo izgleda glomazno može da se uradi za petnaestak minuta i manje Smile

Meni je bilo zabavno, nadam se da će i vama.

Adios ! Ziveli

Zanimljivosti :
Tutorijal ima od 5500 - 5700 reči ne računajući sve ispod i uključujući "Zanimljivosti" sekciju.
Pre ove izmene sada, tutorijal je izmenjen svega 25 puta, pri čemu je jednom dramatično menjan tekst kao i SS-ovi u njemu.
Za tutorijal sam upotrebio scenu igre na kojoj radim sa povremenim kreiranjem svega ponovo kako bih mogao da sinhronizujem SS-ove.
Skriptu sam prilagođavao par puta tutorijalu a poslednji deo vezan za animator i skriptu je napisan pred sam kraj - drugim rečima pojma nisam imao kako će izgledati taj kod dok nisam napisao tutorijal i stigao do te sekcije.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
Ko je trenutno na forumu
 

Ukupno su 645 korisnika na forumu :: 37 registrovanih, 11 sakrivenih i 597 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 1567 - dana 15 Jul 2016 19:18

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 11neco11, A.R.Chafee.Jr., aleksandar_tatic, aligrudici, amaterSRB, amir3045, chester_perry, darkangel, docadoca, Dorcolac, Dragan1998, Faki-Valjevo, jovan.simovic97, krunomiletic5, KUZMAR, ltcolonel, majorgaspar, MarKhan, Marko Marković, Mercury2, Metanoja, Mikulino, mračni čovek, ofbeyond, opt1, Outis, panticstefan53, pein, Predrag Macura, renoje2, rovac, Snorks, Stole Balkanboy, VJ, Warhawk, Zandar, zola92