Jednostavan Exp/Level sistem - Unity, JS

Jednostavan Exp/Level sistem - Unity, JS

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

Recimo da želim da kreiram jednostavan experience sistem za Unity igru.

Tehnički razmišljano ideja je jednostavna :
1. Kada ubijem neprijatelja dobiću exp poene
2. Ukoliko su ti poeni veći od potrebnih poena za sledeći nivo daću igraču nivo
3. Preneću višak poena u novi nivo

Kako bih ovo realizovao moram da znam 3 bitne informacije :
1. Trenutni nivo igrača
2. Trenutni experience igrača
3. Potrebni experience za sledeći nivo

Odatle ćemo krenuti i sa programiranjem.

Desni klik bilo gde u Project kartici Unity-ja > Create > JavaScript
Ja ću je nazvati "Exp_Player".
Možete da je ostavite gde god želite, svejedno ja moje skripte delim na :
1. generalne skripte - one koje ću koristiti više puta tokom projekta, idu u jedan folder
2. lokalne skripte - one koje su vezane samo za jednu scenu u igri, idu u folder scene

Otvorite skriptu u MonoDevelop-u ili bilo kom programu koji želite/koristite/volite.

Hajmo nazad na one tri bitne informacije. Dakle njih moramo znati i napravićemo tri promenljive :

var current_exp : int ; var current_lvl : int ; var required_exp : int ;

Sada kada ove informacije imamo možemo da krenemo dalje. Hajde da zamislimo nešto, čas :
- Recimo da će igra imati više neprijatelja.
- Teži neprijatelji će nam dati više exp poena.

Želimo da kreiramo rešenje koje će biti dinamično - želimo samo da predamo broj exp poena ovoj skripti i pustimo je da završi posao. Dakle taj exp može biti 100, 200, 5000 ...

Napravićemo funkciju koja će primiti jedan argument - broj exp poena koje igrač dobije kad ubije neprijatelja.

function ExperienceAdd(exp : int ){ }

Šta sam sada uradio ? Ako pozovem ovaj kod :
ExperienceAdd(25);
Ovoj funkciji ću dodeliti 25, experience poena u našem slučaju.

Ok, sada kada možemo da dodamo bilo koji broj exp poena našoj funkciji, vreme je da napišemo kod koji će obraditi taj podatak.

Idemo dalje :
- prvo ćemo dodati exp na stari experience
- zatim ćemo proveriti da li je njihov zbir veći od potrebnog broja experienca za novi nivo
- ukoliko jeste daćemo igraču još jedan nivo
- Na kraju, višak exp poena ćemo prebaciti u novi nivo

function ExperienceAdd(exp : int ){ current_exp = current_exp + exp if (current_exp > required_exp) { current_lvl ++; current_exp = current_exp - required_exp ;    } }

Odradićemo mali test : Svakog puta kada igrač klikne dodaćemo određeni broj poena. Kako bi proverili da li je igrač kliknuo okrenućemo se Update funkciji koja kod izvršava svakog frejma.

function Update(){ if (Input.GetMouseButton(0))  ExperienceAdd(15); Debug.Log ("Dodato"); // ova linija koda će ispisati u konzoli "Dodato" kada se kod izvrši }

Celokupna skripta izgleda ovako :
#pragma strict var current_exp: int; var current_lvl: int; var required_exp: int; // Za sledeci nivo function ExperienceAdd(exp: int) {     current_exp += exp; // isto što i current_exp = current_exp + exp;     if (current_exp > required_exp) {         current_lvl++;         current_exp -= required_exp; // isto što i current_exp = current_exp - required_exp;     } } function Update() {     if (Input.GetMouseButtonDown(0))         ExperienceAdd(15);     Debug.Log("Dodato"); }

Okačite skriptu na kameru i u inspektoru podesite parametre :



po želji. Njih takođe možete učitati iz sejva, resetovati ih pri početku igre ili šta god. Obratite samo pažnju, sve izmene dok testirate igru (kada pritisnete "Play") neće ostati permanentne i resetovaće se nakon testa.

Odavde ovaj sistem može da se proširi, recimo :
- ista skripta može da ima funkciju koja će oduzimati experience kada lik umre/doda debuff
- možemo imati podatak potrebnog experience-a za svaki nivo do određenog nivoa
- možemo imati novu funkciju koja će biti zadužena za dodavanje novih talenata, atributa, pasivnih statusa igraču i tu funkciju možemo da pozovemo u funkciji kada igrač dobije novi nivo
...

Toliko za sada, možda proširim tutorijal nekada u budućnosti atributima, talentima i slično.



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

Ukupno su 753 korisnika na forumu :: 31 registrovanih, 9 sakrivenih i 713 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., aramis s, Bogoslov, bojank, celik, Despot1, djordje92sm, goxin, GreenMan, havoc995, ikan, KUZMAR, ljuba, Marko Milakov, Markoni29, mercedesamg, Milan A. Nikolic, Misirac, Mixelotti, mushroom, Roman, shone34, Snorks, suton, Tas011, VJ, Vlada1389, vlvl, voja64, xJeremijAx, Zvrk