Primer projekat : Semafor [Unity]

Primer projekat : Semafor [Unity]

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

Mini projekat koji je nastao iz ove teme. Kasnim sa objavom jer nisam imao vremena ranije...

Ovaj projekat je isključivo primer projekat i služi da se nauči nešto korisno odatle, ništa više.
Na kraju posta ćete naći link za preuzimanje celokupnog Unity projekta.

Projeakt :

Kontrole ::
- Klikom se 3D model čoveka pomera napred
- Ako igrač pomeri igrača dok sija crveno svetlo na semaforu izgubiće 500 *unesi valutu ovde
- Prelaskom ulice se prelazi na drugi nivo
- Igra ima tri nivoa, prvi nivo nema vozila, drugi nivo ima jedno vozilo koje poštuje semafor, treći nivo ima vozilo koje ne poštuje semafor
- Ako vozilo udari igrača izgubiće 1000 *unesivalutu ovde
- Ako igrač ima manje od 0 *unesi valutu ovde nivo se resetuje





Igraj web verziju
Preuzmi x86/x64 exe

Programiranje ::

- Trigger zone
- Pristupanje drugim elementima
- Aktiviranje/isključivanje određenih gameObjecta
- Menjanje teksture materijala
- Pomeranje ka transformu
- Aktiviranje animacija
- Provera blizine
- Dve kamere


Ceo projekat pokreće jedna glavna skripta koja je zadužena za logiku i kontrolisanje stanja objekata. Postoji još par pomoćnih skripti koje uglavnom vrše neke provere vezane za određene objekte.
Ovo nije najbolji pristup međutim mrzelo me je da kickam skripte za ovako mali projekat.

Glavna skripta : GameManager.js
Vrši sve moguće ...
Od promene svetla na semaforu, preko kažnjavanja igrača, promene nivoa, pomeranja igrača itd.
Sve je iskomentarisano lepo.

#pragma strict // This project was created for example purposes // for www.mycity.rs forum. // You can find more information there. var staza : Transform[]; // Set waypointa koji se nalaze u 3D svetu    private var clickCnt : int = 0 ; // Brojac klikova var Player : Transform;  // Transform komponenta modela igraca var speed : float = 0.1 ; // Brzina kretanja modela igraca    private var semaforTimer : float = 8.0; // Brojac koji ce menjati boje i teksture na semaforu var zeleno : GameObject; // Model svetla var crveno : GameObject; // Model svetla var zelenoSvetlo : GameObject; // Zeleno svetlo var crvenoSvetlo : GameObject; // Crveno svetlo var crvenoTex : Texture; // Crvena tekstura var zelenoTex : Texture; // Zelena tekstura var noTex : Texture; // Ugasen semafor tekstura var current : Transform; // Trenutni waypoint var walking : boolean; var PMoney : int = 5000; // Novac igraca var level : int = 1; // Nivo trenutni var zobs : ZOBS; // Druga skripta var jugo : Animator; // Animator komponenta drugog auta var GameOver : boolean = false ; // Bool koji cemo aktivirati kada igrac ima manje od 0 function Start () {    ResetEverything();    Player.animation.wrapMode = WrapMode.Loop; // Zelimo da ponavljamo animaciju         } function Update () { semaforTimer -= Time.deltaTime; // Tajmer za promenu svetla na semaforu    if (semaforTimer <= 0){    semaforTimer = 5.0f ; // Ako je tajmer manji od 0 tj. ako je isteklo vreme onda podesavamo novo vreme    ManageState(); // pozivamo manage state funkciju koja nam menja teksturu i svetla na semaforu    }     Move(); // Pozivamo Move funkciju svakog frejma    if (Input.GetMouseButtonUp(0)){ // Da li je korisnik kliknuo levim dugmetom misa ?       if ( clickCnt <= 3){ // Da li je brojac klikova manji ili jednak brjou 3 ?          clickCnt ++; // Ako jeste dodajemo 1 brojacu          current = staza[clickCnt]; // Podesavamo novi waypoint prema broju klika           walking = true ;           speed = 0.29;           Player.animation.Play ("walk"); // Aktiviramo animaciju nazvanu walk...                  if (crvenoSvetlo.activeInHierarchy == true) { // ako igrac klikne dok je svetlo crveno           PMoney -= 500; // oduzmi mu 500 novca           }       }              }                    if (PMoney <= 0){ // ako je suma novca 0 ili manja od 0    GameOver = true ; // aktiviramo bool Game Over    ResetEverything(); // Pozivamo funckiju koja ce resetovati se        } } function OnGUI(){ GUILayout.Label ("KEŠ : " + PMoney.ToString()); // Par informacija na ekranu cisto radi reda GUILayout.Label ("LEVEL : " + level); } function Move () { // Move funkcija koja pomera 3D model ka sledecoj lokaciji    var direction : Vector3 = current.transform.position - Player.position; // oduzimamo trenutnu poziciju od pozicije lokacije    var moveVector : Vector3 = direction.normalized * speed * Time.deltaTime;      Player.position += moveVector;         if (Vector3.Distance(current.transform.position, Player.position) < 0.1 && walking) // ako je daljina mete manja od 0.1 i ako je aktiviran walking bool tj. ako igrac seta    {    Player.animation.Play("idle"); // menjamo animaciju u idle    speed = 0.0; // potpuno smanjujemo brzinu tj. igrac se ne krece    walking = false; // gasimo walking bool jer sada igrac miruje    } } function ManageState () { // funkcija koja menja svetlo na semaforu    if (zeleno.renderer.material.mainTexture == noTex){ // ako je glavna tekstura ovog materijala jednaka noTex teksturi       zeleno.renderer.material.mainTexture = zelenoTex; // menjamo tu teksturu       zelenoSvetlo.SetActive(true); // aktiviramo svetlo        // obrnuto ovde       crveno.renderer.material.mainTexture = noTex;       crvenoSvetlo.SetActive(false);       zobs.kreni = false;    } else if (crveno.renderer.material.mainTexture == noTex){    zeleno.renderer.material.mainTexture = noTex;    zelenoSvetlo.SetActive(false);        crveno.renderer.material.mainTexture = crvenoTex;    crvenoSvetlo.SetActive(true); zobs.kreni = true;    } } function ResetEverything () { // funkcija koja ce resetovati sve na pocetne vrednosti    Player.position = staza[0].position; // Igraca stavljamo na istu lokaciju gde se nulti transform u nizu nalazi        speed = 0.0; // pocetna vrednost brzine je 0    current = staza[0]; // trenutnu metu stavljamo kao nultu    clickCnt = 0; // resetujemo brojac klikova    Player.animation.Play ("idle"); // igrac miruje stoga tu animaciju pozivamo    zeleno.renderer.material.mainTexture = noTex; // Menjamo nazad vrednosti semafora, u pocetku je crveno svetlo    zelenoSvetlo.SetActive(false);    crveno.renderer.material.mainTexture = crvenoTex;    crvenoSvetlo.SetActive(true);           if (level == 2){ // dodatne postavke za drugi nivo, jer se ova funkcija poziva i kada igrac predje nivo       zobs.kreni = true; // menjamo vrednost kreni booleana iz druge skripte na true       zobs.LancerAnim.enabled = true; // aktiviramo animator komponentu preko druge skripte vozila 1       }       if (level ==3 ) {       jugo.enabled = true; // aktiviramo premocnog i svemocnog juga koji nece postovati semafor ! BRRM BRRM BITCHES       }           if (GameOver || level >=4){ // ako je nivo 4 ili ako je aktiviram bool game over, resetujemo scenu potpuno...       Application.LoadLevel("GameScene");       } }

Pomoćne skripte :

Max of Doom :
#pragma strict var GM : GameManager; function OnTriggerEnter (other : Collider) { if (other.tag == "Car"){ this.animation.wrapMode = WrapMode.Once; this.animation.Play ("death"); yield WaitForSeconds(this.animation["death"].length); this.animation.wrapMode = WrapMode.Loop; GM.ResetEverything(); GM.PMoney -= 1000; } }

Zobs :
#pragma strict var kreni : boolean ; var LancerAnim : Animator; function OnTriggerStay(other : Collider) {     if (other.tag == "Car"){        if (!kreni){        LancerAnim.enabled = false;           }        if (kreni){        LancerAnim.enabled = true;        }        Debug.Log (kreni); } }

Trigger Finish :
#pragma strict var GM : GameManager ; function OnTriggerEnter(other : Collider) { if (other.tag == "Player"){        GM.level ++;    GM.ResetEverything(); } }

Unity projekat



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

Ukupno su 935 korisnika na forumu :: 15 registrovanih, 5 sakrivenih i 915 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: _Rade, cikadeda, DPera, dragoljub11987, ILGromovnik, Karla, Kriglord, Krvava Devetka, MilosKop, opt1, raykan, slonic_tonic, sovanova95, styg, zlaya011