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
|