Komponente
Da ponovimo:
Klase
Kao što je dosada pominjano, C# je tzv objektno orijantisani progamski jezik. Cilj je da se spakuju povezane funkcionalosti i vrednosti u takozvane objekte (koji nisu ništa drugo nego promenljive). Na primer: sve što se tiče glavnog igrača je u objektu koji najčešće nazivamo player. Sve što se tiče njegovog neprijatelja se čuva u objektu koji obično nazovemo enemy. A šta ako je potrebno da se ima veći broj neprijatelja? Zato je zgodno što koristimo klase. Klasa je u stvari šablon (eng.template) pomoću kojega se prave objekti. Klasa opisuje kako bi objekti te klase trebalo da „izgledaju“ i kako bi trebalo da se ponašaju. Definicija klase počinje ključnom rečju class, nakon toga sledi ime klase. Uobičajeno je da se imena klasa započinju velikim slovom, da bi ih lakše razlikovali od drugih vrsta promenljivih. Nakon imena klase sledi blok uokružen vitičastim zagradama, a u tom bloku se nalazi programski kod sa svime vezanim za tu klasu. Primer:
class enemy {
int health;
}
Skripte
Kao što je već rečeno, korišćenjem skripti se definiše ponašanje. Skripte se „prikačinju“ za objekte, baš kao i druge komponente, i daju im funkcionalnosti. U opštem slučaju imamo tri koraka prilikom rada sa skriptama:
- Kreiranje skripte
- Prikačinjanje skripte na jedan ili više objekata igre
- Ako je potrebno, postavljanje vrednosti propertija, promenljivih ili nekih osobina potrebih za skriptu
Ako želite da kreirate objekat od skripte ili od klase, to je veoma jednostavno. Pošto se skripte tretiraju kao komponente, mogu se jednostavno „prevući“ do objekta u igri, to će da automatski kreira objekat te klase. Ovaj proces se još zove i instantizacija. Rezultat (kreirani objekat) se stoga često naziva i instanca klase.
Kreiranje instanci,
kao na primer instance od objekata igre, se može vršiti kroz C# programski kod. U ovom primeru se prvo treba deklarisati promenljiva tipa class. Nakon toga se radi instantizacija objekta. Time se kreira novi objekat, što se radi pomoću ključne reči new i nakon toga se navede naziv klase.
Enemy neprijatelj1;
neprijatelj1 = new Enemy();
ove dve linije se mogu napisati i u kratkom obliku:
Enemy neprijatelj2 = new Enemy();
Dve
zagrade na kraju
se moraju pisati, jer to nije oznaka
za klasu,
već je u
pitanju konstruktor klase, tj metoda koja se izvršava
prilikom kreiranja objekta.
*******************************************************************
GameObject i komponente
Do sada je pominjano da se projekat sastoji od Asset-a i da je naša scena (što je specijalan Asset) sastavljena od objekata igre. A kako se kreira objekat igre? Pomoću kompozicije komponenti.Sve
u Unity se računa kao objekat igre (GameObject). Međutim,
GameObject ne radi ništa sam za sebe. Sve funkcionalnosti se
ugrađuju pomoću komponenti. Tako, ako želimo da naš GameObjekt
ima neku određenu funkcionalnost, onda mu se dodaje odgovarajuća
komponenta.
Korišćenje lokalnih komponenti:
Kao što ste mogli dosada primetiti u Inspektoru, objekti se sastoje od raznih komponenti. Tu je uvek komponemta Transform, a opciono mogu biti i druge komponente, kao što su na primer Renderer, Light, Camera, … Skripte su takođe komponente.
(Da se podsetimo: Komponenta koju ima svaki objekat igre je Transform, kojom se upravlja pozicijom, rotacijom i veličinom objekta. )
Pristup komponenti Transform
Izmenama ove komponente se postiže efekat da se objekti kreću po sceni.
Podsetimo se: transform komponenta objekata se sastoji od njegove translacije (ili pozicije), rotacije i od skale. … (engl. position, rotation, scale). Iako ih se može menjati direktno, ipak je lakše koristiti neke ugrađene metode:
// kretanje po x-osi
transform.Translate(0.05f, 0f, 0f); // float brojevi se pišu sa dodavanjem slova f na kraju
// rotiranje u odnosu na z-osu
transform.Rotate(0f, 0f, 1f);
// skaliranje tako da objekat bude dvostruko veći u svim pravcima
transform.localScale(2f, 2f, 2f);
S obzirom da su Translate() i Rotate() metode, ako navedeni programski kod postavimo u Update(), objekat će da se kontinualno kreće u pozitivnom smeru x-ose i da se istovremeno rotira oko z-ose.
Kako pronaći transform:
S obzirom da svaki objekat igre ima komponentu transform, nema potrebe da je se posebno traži, već se pristupa kao u prethodno navedenom primeru. Ovo je jedina komponenta sa kojom se tako radi! Svima ostalima se pristupa korišćenjem metode GetComponent.
Vežba br.1: u igri kreirati jedan objekat, postaviti da se kreće i okreće
****************************************************************************
Dodeljivanje komponenti objektima igre
Prvi način je dodavanje komponenti u Inspector-u: da se komponenta "prevuče" u inspektor, ili da se u Inspektoru klikne na Add Component i da se doda željena komponenta. Time će se izabrana komponenta dodeliti trenutno selektovanom objektu igre.
Drugi način je dodeljivanje komponenti kroz programski kod: umesto da se prevuče komponenta, kao što je na primer skripta, na željeni GameObject, alternativno se može komponenta dodeliti objektu igre i korišćenjem programskog koda. Za to služi komanda AddComponent
gameObject.AddComponent<MojaSkripta> ();
Pristupanje komponentama objekata igre
Pristupanje sopstvenim komponentama (unutar objekta igre u kojem smo) vrši se tako što se prvo navede reč gameObject, pa tačka i dalje znate kako to ide:
MojaSkripta nekaMojaSkripta = gameObject.GetComponent<MojaSkripta>();
(napomena:
obratite
pažnju
da kada se radi o tekućem objektu, počinje se malim slovom:
gameObject, ovo je kao korišćenje ključne reči this u
Programiranju )
Korišćenje metode GetComponent:
U toku rada igrice, sa komponentama se vrši interakcija putem skripti. Prva stvar koju treba obezbediti je da se dobije referenca na komponentu sa kojom se želi raditi.
Metoda GetComponent() kao rezultat vraća prvu komponentu traženog tipa koja se nalazi u istom objektu igre kao i skripta u kojoj je.
Preporuka je da bi ovo trebalo uraditi u Start() a rezultat sačuvati u promenljivoj. Na taj način se ovo neće morati raditi više puta.
Primer:
Light lightComponent; // promenljiva za čuvanje dobijene komponente tipa light
Start() {
lightComponent=GetComponent<Light>();
lightComponent.type = LightType.Directional;
}
Jednom kada imate referencu na komponentu, dalje možete da joj menjate propertije kroz kod. To se radi tako što se navede naziv promenljive (u kojoj je referenca na komponentu) zatim se navede tačka i nakon toga naziv propertija koji želite da menjate. U navedenom primeru se menja properti type komponemte light da bude Directional.