Uvod u programiranje - Skripte - Javascript Unity

Uvod u programiranje - Skripte - Javascript Unity

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

Kada se prvi put sretnete sa Unity endžinom, shvatićete da sve zahtevnije stvari moraju da se isprogramiraju. To je potpuno normalno.
Ukoliko imate neko pozadinsko iskustvo u programiranju, veoma lako ćete se uklopiti, zahvaljujući sličnim tutorijalima i dobrom dokumentacijom koju Unity pruža svojim korisnicima.

Unity podržava tri jezika za pisanje skripti :
- Javascript
- C#
- Boo

Postoje određene razlike kod njih međutim po pravilu, bilo kojim jezikom da pišete moći ćete da uradite sve što ostala dva mogu.

Meni je JS legao jer dolazim iz VB okruženja, ujedno mi se sviđaju neke pogodnosti koje donosi.
Stoga, ovaj tutorijal će fokusirati JS.

Indeks :

1. Deklarisanje promenljivih (Variables)
1.1 Prosleđivanje vrednosti promenljivoj
1.2 Arrays - ugrađeni niz
1.3 Arrays - JS niz
1.4 Arrays - Liste
1.5 Public, Private, Static

2. Uslovi (If, else ...)
2.1 If Else

3. Petlje (While, for... )
3.1 For
3.2 While
3.3 Do While
3.4 For Each
4. Funkcije
4.1 Argumenti
4.2 Return
4.3 Overload

Bonus
5. Pristupanje vrednostima iz drugih skripti
5.1 Skraćenice u pisanju

1. Deklarisanje promenljivih

Recimo da će u našoj igri igrač imati municiju. Broj municije moramo negde da držimo privremeno tokom rada igre kako bi nam bila dostupna!

Za to ćemo koristiti promenljive.
Njih možemo da deklarišemo unapred i kasnije im dodelimo bilo koju vrednost !

Deklarisanje promenljive u JS-u se vrši upotrebom ključne reči var koju prati naziv promenljive.
Naziv promenljive može biti bilo šta dok god ne počinje brojem ili znakom. Na kraju, dodajemo tačku zapetu ; koja mora da isprati svaku liniju sem zagrada kod JS skripti.

var municija;

Ukoliko već imate neko pozadinsko iskustvo u programiranju primetićete da nismo naznačili kog tipa će biti ova promenljiva.

Ukoliko pišete JS skripte, promenljive mogu imati različite tipove koji odgovaraju različitim tipovima podataka.

1.1 Prosleđivanje vrednosti promenljivoj
Javascript nam omogućava da deklarišemo promenljivu bez njenog tipa i ona će se prilagoditi unosu koji joj dodelimo.

Dakle, sada imamo promenljivu nazvanu municija i možemo joj dodeliti vrednost :

municija = 10 ;

Ovaj kod možemo napisati bilo gde u skripti i on će raditi. Međutim isto tako možemo odmah da definišemo broj municije kada jednom deklarišemo promenljivu :

var municija = 10 ;

Razlika između ova dva koda je ta što kada skriptu pokrenemo sa samo deklarisanom promenljivom, ona neće imati nikakvu vrednost i moramo joj dodeliti kasnije vrednost, dok kada ovako deklarišemo promenljivu ona će imati vrednost 10 čim se skripta pokrene.

Rekao sam ranije da nisam nigde naveo tip promenljive. To znači da ovoj promenljivoj mogu dati ovu vrednost takođe :

municija = "deset";
ili ovu
municija = 10f;

Prvi put kada prosledim vrednost promenljivoj, JS će prepoznati tip vrednosti i ona će u prvom slučaju postati integer, u drugom string a u trećem float.

No ukoliko pišete igre za pametne telefone, često ćete morati da definišete tip promenljive unapred.
Kako bi odredili tip promenljive možemo da koristimo dvotačku : :

var municija : int ;
var municija : float ;
var municija : String;
var municija : bool;

Jednom kada deklarišem promenljivu kao, na primer, integer, ne mogu joj proslediti string, float ili neki drugi tip koji nije integer, isto važi za sve ostale tipove.

Pored standardnih tipova, JS promenljiva može takođe da se deklariše upotrebom Unity objekata :
var igrac : GameObject;

Takođe, kada dodam i tip promenljive, mogu da joj dodelim vrednost u istoj liniji :

var municija : int = 10;

1.2 Array - Ugrađeni Array

Promenljive takođe mogu držati više podataka istovremeno !
Na primer, recimo da imamo slučaj gde moramo znati koliko jedna porodica ima ukućana, koliko je dece i koliko odraslih. Umesto da koristimo jednu promenljivu za svaki podatak, možemo da stavimo sve podatke u jednu promenljivu, primer :

var ukucani = 5; var odraslih = 3; var dece = 2;

Možemo u kraćem obliku da napišemo :

var informacije = [5, 3, 2];

Ovo je u programiranju poznato kao Array tj. niz.

Unity podržava više vrsti nizova. Pogledajmo :

Built In Array

Ovaj array je najbrži u Unity-ju. On mora da se deklariše unapred i fiksan je.

Deklariše se ovako :

var nekiniz = new Int[3];

Dakle, ključna reč var, nakon nje pišemo ime niza, zatim znak jednakosti, ključna reč new, zatim tip podataka, u ovom slučaju koristimo Integer i na kraju u zagradama napišemo veličinu tog niza.

Sada ovom našem divnom nizu možemo dodeliti podatke na ovaj način :

nekiniz[0] = 5; nekiniz[1] = 3; nekiniz[2] = 2;
Međutim, ukoliko bi pokušali da u nizu koji ima fiksnu veličinu dodamo novi unos koji prevazilazi tu veličinu :

nekiniz[3] = 2;

Dobili bi grešku da smo prekoračili ograničenje.
Primetite, niz kreće od 0 a ne od 1, stoga je u nizu veličine 3 mesta poslednji unos 2.

1.3 JS Array

Pored ovog prethodnog ugrađenog niza, JS može pozvati svoj niz koji ima drugačije karakteristike.
Ovaj niz se može pozvati samo ukoliko pišete JS skriptu ! Sporiji je od sva tri niza.
Pogodnosti koje on pruža su dinamičnost tokom rada aplikacije.
Za razliku od ugrađenog array-a, JS array može da menja veličinu tokom rada bez problema i da prihvata različite tipove podataka čak i u samom array-u. Međutim njihova upotreba će uticati na performanse iako su više "prijateljski" nastrojeni prema korisnicima.
Pogledajmo kako oni rade :

Možemo da deklarišemo JS array ukoliko pišemo u JS-u :
var JSniz = new Array();

Bilo kada tokom rada aplikacije možemo dodati novi podatak u taj niz :
JSniz.Add(2); JSniz.Add(3); JSniz.Add(2);

Ukoliko želimo privremeno da kopiramo podatak iz niza, možemo da mu pristupimo vrlo jednostavno u oba slučaja :
var kopija_informacije = JSniz[1];
ili za ugrađeni niz :
var kopija_informacije = nekiniz[1];

JS Array podržava i brisanje elemenata zahvaljujući svojoj dinamičnosti, pa možemo obrisati element iz niza ovako :

JSniz.RemoveAt(3);

1.4 ArrayList
Array List je takođe dostupna klasa, ponaša se skoro isto kao i JS array stim što i C# može da je koristi. Mane su više/manje iste, ArrayList je sporiji od ugrađenog array-a. Koristi se slično kao i JS Array :

//deklarisanje var NizLista = new ArrayList(); // dodavanje elementa NizLista.Add(5); // brisanje elementa na poziciji NizLista.RemoveAt(0); // povratna informacija o dužini niza var duzina_niza = NizLista.Count;

1.5 Public, Private, Static
Svaka promenljiva deklarisana u Javascript-u je "public", što znači da ćete je videti u Inspektoru jednom kada okačite skriptu na GameObject.



Ovo nije slučaj u, na primer C#, gde moramo da naznačimo da će promenljiva biti Public.

No, nekada ne želimo da vidimo promenljivu u inspektoru, kada na primer znamo da sigurno nećemo da je menjamo.

Public :
var nekapromenljiva = 5; // biće dostupna u Inspectoru // biće dostupna drugim skriptama

private var nekapromenljiva2 = 5; // neće biti vidljiva u Inspector-u // neće biti dostupna drugim skriptama

static var nekakpromenljiva3 = 5; // biće vidljiva u Inspector-u // biće dostupna globalno kroz projekat


2. Uslovi (IF, ELSE ... )

Takođe jedan veliki deo programiranja čine uslovi. Zamislite da imamo boolean koji kontroliše kraj igre... Želimo da proverimo : Ukoliko je vrednost tog bool-a 1, završićemo igru.
Uslove možemo napisati na više načina :

if (uslov_napišemo_ovde) { // BLOK KODA }

Pa bi tako za naš slučaj spomenut ranije mogli da napišemo ovako :

if (gameover == true) { // BLOK KODA }

Međutim možemo malo da skratimo ovaj kod :

[code]if (gameover) { // BLOK KODA }[/code]

Kako boolean može imati samo dve vrednosti - da i ne tj. 1 ili 0, možemo da napišemo suprotnu proveru upotrebom znaka uzvika !

if (!gameover){ // BLOK KODA }

2.1 If... Else... Else If

Međutim ! Možemo da pokrijemo oba uslova u sklopu jednog uslova, upotrebom ključne reči else

if (gameover){ // BLOK KODA } else { // BLOK KODA }

U iznad napisanom kodu, ukoliko je vrednost "gameover" bool-a 1, izvršiće se određeni kod, međutim ukoliko nije izvršiće se drugi kod. Kako bool ima samo dve vrednosti ovaj kod je sasvim na mestu.

Međutim šta ako imamo drugi tip podatka i želimo da uradimo dodatun proveru u sklopu jednog uslova ?

Možemo da koristimo else if

Recimo da imamo jedan broj, želimo da proverimo da li je taj broj veći od 10, manji od 10 ili tačno 10, možemo to sve da napišemo u sklopu jednog uslova ovako :

var broj = 10 if (broj > 10) { Debug.Log = ("Broj je veći od 10"); } else if (broj < 10) { Debug.Log = ("Broj je manji od 10"); else { Debug.Log = ("Broj je 10!"); } } }

Ukoliko pak postoji neki kod koji je obična linija provere, If uslov se može napisati u jednoj liniji takođe :
if (broj == 10) Debug.Log ("Broj je 10 !")

3. Petlje

Petlje su tu da nam skrate vreme pisanja koda, pomognu oko brojenja, iscrtaju UI...
Takođe čine standardni deo koda u programiranju bilo da je to Igra, neki program ili nešto treće.
Postoji nekoliko različitih petlji i one će se izvršavati dok god postoji uslov koji mi postavimo.

3.1 For

For petlja prima tri parametra :
1. Novu privremenu promenljivu
2. Uslov do kog će se izvršavati
3. Šta će raditi svakog ciklusa

Primer :
for (var i=0; i<=20; i++){ Debug.Log(i); }

Ovde dakle vidimo ključnu reč for, zatim u zagradama tri parametra :
var i = 0 ; - Deklarišemo privremenu promenljivu i i dajemo joj vrednost 0
i<=20; - For petlja će raditi dok god se ne ispuni ovaj drugi parametar tj. dok god je vrednost promenljive i manja od ili jednaka 20
i++ - Kako će se petlja "računati" u ovom slučaju dodajemo 1 na i (i++ je skraćenica za i+=1)

Umesto navedenih uslova i promenljivih, možemo iskoristiti i druge vrednosti, nizove ili nešto treće.

3.2 While

Za razliku od prethodne petlje, While će se izvršavati dok god se ne ispuni jedan uslov.

var broj = 0; While (broj < 20) { broj ++ Debug.Log (broj); }

3.3 Do While
Postoji veoma mala razlika između Do While i While petlje.
While petlja proverava uslov na početku, dok Do While proverava uslov na kraju.

Piše se nešto drugačije a u ovom praktičnom primeru ćemo videti kako radi :

function Start () { var nastavi = false ; do { Debug.Log ("MyCity"); } while (nastavi); }

Hajde da analiziramo ovaj kod.

Deklarisali smo jedan bool kako bi kontrolisali tok petlje.
Zatim smo upotrebili ključnu reč do koju smo propratili otvorenom zagradom. Pre nego što zatvorimo zagradu ispisaćemo ono što će se desiti svakog ciklusa tokom trajanja petlje. Zatim smo u nastavku zatvorene zagrade upotrebili ključnu reč while i napisali uslov.

Dakle, ovaj kod će raditi dok god je vrednost "nastavi" promenljive 1. Međutim kada pokrenete ovu skriptu videćete da je bez obzira na naš uslov u konzoli ispisan tekst ! To je zato što, dakle, tako radi Do While. Da smo koristili samo While petlju kod se ne bi izvršio ni jednom jer uslov ne bi bio ispunjen, dok će se Do While izvršiti bar jednom pre nego što proveri uslov.



3.4 For Each

For Each je sjajan za prolaženje kroz nizove ! Ići će kroz svaki element dok ne stigne do kraja niza, nakon čega će se deaktivirati.

Recimo da smo negde definisali niz :
var MyCity = new String[4]; // i da smo mu dodelili te vrednosti MyCity[0] = "Srki82"; MyCity[1] = "Unity 4.5"; MyCity[2] = "Programiranje 3D igara"; MyCity[3] = "JavaScript";

Možemo proći kroz ovaj niz upotrebom for each petlje :

for (var predmet : String in MyCity){ Debug.Log (predmet); }

4. Funkcije

Pored upotrebe standardnih i predviđenih funkcija kao što su Start, Update, Awake , OnGUI itd. mi možemo da napravimo naše funkcije koje će izvršiti neki blok koda. Njih jednostavno pozivamo jednom linijom koda takođe !

Hajde da napravimo jednostavnu funkciju koja će ispisati nešto u konzoli :

function Ispisi () { Debug.Log ("Funkcija radi !"); }

Sada smo kreirali ovu funkciju i njena svrha je trenutno ispisivanje navedenog teksta u konzolu.
Ovu funkciju možemo da pozovemo da se izvrši jednom linijom koda :

Ispisi();

Ovu liniju možemo napisati u bilo kojoj drugoj funkciji. Hajde da je stavimo u Start funkciju :

function Start () { Ispisi(); }

Kada pokrenete igru u konzoli će se pojaviti 'Funkcija radi' tekst.

4.1 Argumenti
Funkcije takođe mogu primiti vrednosti koje kasnije mogu obraditi.

Uzećemo za primer prethodnu funkciju. Umesto da funkcija svaki put ispiše "Funkcija Radi", želim da ispiše tekst koji joj ja prosledim.
Da bih uopšte mogao da prosledim funkciji neki parametar, moram prvo da je deklarišem sa tim u vidu :

function Ispisi(tekst : String) { }

Ovde sam u zagradi napisao ime promenljive i njen tip (String). Pisanje tipa nije potrebno uvek, već samo ukoliko pišete igru za određene platforme (iPhone npr.).

Sada kada funkcija ima u vidu da će možda primiti neki podatak, mogu da iskoristim ovaj podatak bilo gde u funkciji i obradim ga kako želim :

function Ispisi (tekst : String) { Debug.Log (tekst) ; }

Sada će umesto statičnog teksta "Funkcija radi", ova nova funkcija ispisati u konzoli string koji prosledim funkciji ! Hajde da probamo da pozovemo funkciju i prosledimo joj neki tekst :

function Start () { Ispisi("MyCity forum je sjajan !") ; }

U konzoli će se pojaviti taj tekst.

Takođe možemo da prosledimo neku drugu promenljivu funkciji :

var tekst_za_prosledjivanje = "MyCity forum je sjajan !"; Ispisi (tekst_za_prosledjivanje);

4.2 Return
Funkcije takođe mogu vratiti tačnu ili netačnu vrednost.
Recimo da želimo da napišemo funkciju koja će primiti jedan broj i proveriti da li je taj broj veći ili manji od 10. Međutim umesto da vratimo odgovor konzoli, vratićemo vrednost upitu.

function ProveraBroja(broj : int ) { if (broj > 10) { return true ; } else { return false ; } }

Zatim ćemo funkciji proslediti broj i pozvaćemo proveru iz funkcije Start :

var nekibroj = 9; function Start () { if (ProveraBroja(nekibroj) { Debug.Log ("Broj je veći od 10") } else { Debug.Log ("Broj je manji od 10") } }

Ukoliko sada promenite vrednost "nekibroj" promenljive na 11, videćete da ćete dobiti drugačiji ispis u konzoli.

Funkcije takođe mogu da menjaju promenljive van njih :

var broj ; function PromeniBroj () { broj = 10 ; }

4.3 Overload
Na kraju, postoji nešto što se naziva "Function overload". Ukratko - možete imati više funkcija sa istim imenom dok god te funkcije ne obrađuju isti tip podataka, na primer, ovo je jedna skripta :

function Tip (unos : int) { Debug.Log ("Integer") ; } function Tip (unos : String) { Debug.Log ("String') ; } function Start () { Tip ("10"); Tip (10); }

Videćete da će se u konzoli ispisati dve poruke.



5. Pristupanje drugim skriptama

Neretko ćete se naći u situaciji gde će biti potrebno da pristupite drugoj skripti.
Unity nam može pomoći na par načina. Prvi je getComponent o kome možete pročitati više u dokumentaciji, drugi način ću vam pokazati na primeru.

Recimo da na sceni imamo jedan gameObject koji je zadužen za informacije o igri. Na taj gameObject je prikačena komponenta - skripta koja sadrži sve te informacije.
Znamo sigurno da se ova skripta neće menjati nikada tokom trajanja igre pa možemo to da upotrebimo u našu korist.

Recimo da se skripta koja je okačena na taj gameObject naziva "Informacije" :
Možemo da deklarišemo novu promenljivu ovako :
var nasa_skripta : Informacije ;

Zatim u inspektoru prevučemo tu skriptu u određeno mesto koje se tamo pojavilo i možemo da pristupimo ovoj skripti na ovaj način :
Recimo da u skripti Informacije imamo funkciju "ProveraSkora"

nasa_skripta.ProveraSkora() ;

Isto tako možemo da dodamo neku vrednost funkciji ili promenljivoj :

nasa_skripta.NekaPromenljiva = 5; nasa_skripta.DodajSkor(10, 12, 10);

Međutim ovaj način dolazi sa manom - veza mora uvek biti statična između tog gameObject-a.

5.1 Skraćenice u pisanju

Postoje određene skraćenice koje možemo iskoristiti tokom pisanja koda ! Skraćenice će vam spasiti vreme a po meni su takođe preglednije jer je kod "elegantniji", evo nekoliko primera :


if (neki_bool == true) { //neki kod }
Se može ovako napisati :
if (neki_bool) { //neki kod }

Kako bool može imati samo 2 vrednosti, možemo da iskoristimo samo naziv bool-a što znači da u proveri pitamo da li je pozitivna vrednost , ili upotrebimo znak uzvika da proverimo da li je negativna vrednost.

if (neki_bool == false) { //neki kod }
Se može ovako napisati :
kada možemo napisati :
[code]if (!neki_bool) { //neki kod }[/code]

Dodavanje na vrednost možemo da skratimo takođe :

Umesto da pišemo :
broj = broj + 1;

Možemo da skratimo kod ovako :

broj += 1;

Međutim ukoliko dodajemo samo jedan na vrednost, možemo da skratimo kod još više :

broj ++;

ili negativno :

broj --;

Šta je s množenjem i deljenjem ?

broj = broj /2;

možemo skratiti ovako :

broj *= 2;

Kada želimo da proverimo da li je neka vrednost nejednaka možemo iskoristiti :
!=



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 03 Dec 2014
  • Poruke: 5

Ovako nesto mi treba Smile



Ko je trenutno na forumu
 

Ukupno su 621 korisnika na forumu :: 51 registrovanih, 8 sakrivenih i 562 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, _Petar, A.R.Chafee.Jr., aramis s, Arhiv, Atomski čoban, baki60, bojank2, bojcistv, bulovic, cvele130, cvrle312, darkstar101, Davor Kondic, Drug pukovnik, Dzoni Stek, goran.vvv, GreenMan, havoc995, imperator10, indja2, ivance95, Koca Popovic, Kos93, KUZMAR, ladro, ljuba.b, ltcolonel, Marko Marković2, MarkoRapic, mačković, mgaji21, Mikulino, Milan Kosić, Mirage 2000N, nenad812, Oluj2.1, Outis, petkovic56, RADOVAN.S, renoje2, S-lash, sasa.zoric, Skywhaler, Ssssssss, Toni, vasa.93, vespa nikola, vlvl, zax22r, |_MeD_|