Jednostavan Exp/Level sistem - Unity, JS

Jednostavan Exp/Level sistem - Unity, JS

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

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 1032 korisnika na forumu :: 27 registrovanih, 3 sakrivenih i 1002 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., anbeast, ccoogg123, DejanSt, DonRumataEstorski, dule10savic, galerija, GandorCC, HrcAk47, Ilija Cvorovic, krkalon, Leonov, lord sir giga, mercedesamg, Mercury, Metanoja, Nikolaa11, NoOneEver Dreams, raptorsi, ruger357, Shinobi, vathra, vlajkox, vukovi, zeo, zixmix, žeks62