You are on page 1of 76

NAPREDNE TEHNIKE RAZVOJA

VIDEOIGARA
RAZVOJ 3D IGRE IZ PRVOG LICA
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
OSNOVNI DIZAJN VIDEOIGRE
Osnovni dizajn videoigre
U ovom poglavlju ćemo razviti prototip akcijske videoigre pucanja iz prvog lica

- Naučiti ćemo:
- temeljne mehanike kretanja u 3D prostoru
- ostvariti interakciju s drugim objektima

- Implementirati ćemo:
- ponašanje neprijatelja igrača
- sustav životnih bodova
- sustav sigurnosnih točaka
- osnovni izbornik
- slijedno izvođenje razina

3
Osnovni dizajn videoigre
− Temeljne mehanike
− Kretanje
− Skakanje (dvostruki skok)
− Korištenje oružja (ispucavanje projektila)
− Promjena oružja
− Životni bodovi (igračevi i neprijateljski)
− Dvije vrste protivnika (mumije, statični topovi)

−Cilj igrača: savladati protivnike na razini, kako bi mogao portalom na sljedeću razinu

4
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
POSTAVKE PROJEKTA
Postavke projekta
Radimo 3D videoigru -> Kreiramo projekt s 3D predloškom
− Kreiramo prototip osnovnih mehanika videoigre (jednostavni
objekti)

− Početnu scenu nazovite „Testiranje”.


− Preimenujte glavnu kameru u „Glavna kamera” , objekt izvora
svijetlosti nazovite „Usmjereno svjetlo” (Field of View = 70,
Clipping Planes Near = 0.01, Shadow Type > Strength = 0.5)

− Kreirajte prazan objekt: Okolina


− Unutar okoline kreirajte kocku: Podloga (GameObject > 3D
Object > Cube), veličina podloge (100,1,100), pozicija (0,-0.5,0)
− Kreirajte novi direktorij: Materijali (unutar njega kreirajte
materijal, pridružite ga podlozi, boja: #0C2035)

6
Zadatak
Unutar okoline kreirajte (korištenjem objekta Cube):
−1 platformu
−3 stepenice
−3 kocke
−2 rampe
−1 zid

Kreirajte poseban materijal za elemente poligona, pridružite ga


izrađenim preprekama, boja: #FFDA4F

7
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
PITANJA ZA PONAVLJANJE
Pitanja za ponavljanje
− Koje su osnovne mehanike kretanja?
− Koje su osnovne mehanike sustava životnih bodova?
− Koje su osnovne mehanike sustava oružja?
− Koja je uloga glavne kamere?
− Što je to usmjereno svjetlo?
− Kako se kreiraju osnovni oblici u alatu Unity?

9
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
KREIRANJE IGRAČA
Kreiranje igrača
Kreiramo prazni objekt: Igrač (pozicija (0,0,0))

Kreiramo vizualni prikaz igrača u objektu Igrač: Izgled


(Desni klik na objekt Igrač > 3D Object > Capsule, pozicija
(0,1,0) )

Mesh renderer – komponenta za iscrtavanje 3D objekta

Capsule Collider – sudarač služi sa detekciju kolizije s


drugim objektima na razini, temelj interakcije između
objekata u videoigrama.

11
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
KRETANJE IGRAČA
Kreiranje igrača - Kretanje
Os Z – definira smjer objekta prema naprijed / natrag

Os X – definira smjer objekta prema desno / lijevo

Os Y – definira smjer objekta prema gore / dolje

2 načina implementacije kretanja objekta Igrač


- Character Controller - omogućava jednostavno
pomicanje objekta na temelju definiranih sudarača
na razini
- Rigidbody - veća kontrola nad brojnim parametrima
simulacije fizike

13
Kreiranje igrača - Kretanje
Koristit ćemo komponentu Character Controller za izradu
relativno standardnog sustava kretanja (dodajemo ga na
vršni objekt igrača)

Slope Limit - definira maksimalan nagib pod kojim se igrač može kretati na neravnim
površinama (45)
Step Offset - svojstvo koje definira visinu na koju se igrač može izravno popeti (0,3)
Skin Width - definira debljinu sudarača igrača
Min Move Distance - definira minimalni pomak igrača koji će se izvršiti
Center - definira središte (postaviti na 0,1,0)
Radius - definira radijus
Height - visina sudarača koji je u obliku kapsule

14
Kreiranje igrača - Kretanje
Pošto koristimo Character Controller koji ima svoj sudarač, potrebno je na objektu
Izgled obrisati komponentu Capsule Collider

15
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
POMICANJE IGRAČA
Kreiranje igrača - Pomicanje
Prva funkcionalnost koju implementiramo. Pomicanje lijevo/desno i naprijed/natrag
- Kreiramo novi direktorij Skripte
- Unutar direktorija kreiramo skriptu IgracKretanje (dodajemo skriptu na vršni objekt
igrača)
- Zatim kreiramo 3 varijable u skripti IgracKretanje
- brzinaKretanja
- cc (ref. Na Character Controller)
- ulazKretanje (vektor u kojeg pohranjujemo ulazne vrijednosti s tipkovnice)

public float brzinaKretanja;


private CharacterController cc;
private Vector3 ulazKretanje;

17
Kreiranje igrača - Pomicanje
Dalje su nam potrebne 3 metode (funkcije)
− Awake – dohvaćamo referencu na komponentu CharacterController
void Awake (){
cc = GetComponent<CharacterController>();
}

18
Kreiranje igrača - Pomicanje
- PomicanjeIgraca – dohvaća podatke iz tipkovnice, pomiče objekt igrača
void PomicanjeIgraca(){
ulazKretanje.x = Input.GetAxis("Horizontal");
ulazKretanje.z = Input.GetAxis("Vertical");
if (ulazKretanje.magnitude > 1){
ulazKretanje = ulazKretanje.normalized;
}
ulazKretanje=ulazKretanje * brzinaKretanja;
cc.Move(ulazKretanje * Time.deltaTime);
}

19
Kreiranje igrača - Pomicanje
− Update – Pozivamo metodu PomicanjeIgraca();
void Update(){
PomicanjeIgraca();
}
− Snimite skriptu, postavite vrijednost varijable brzinaKretanja = 10
− Korištenjem tipki W, A, S, D upravljate likom po podlozi igre

20
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
UPRAVLJANJE KAMEROM
Kreiranje igrača – Upravljanje kamerom
−Os X – gore/dolje (rotiramo samo pogled igrača)
−Os Y – lijevo/desno (rotiramo objekt igrača)
−Kretanje objekta igrača u odnosu na trenutnu rotaciju igrača
−U skripti IgracKretanje kreiramo 2 nove varijable
public Transform kamera;
public float osjetljivostMisa;
—Kreiramo novu funkciju: RotiranjeIgraca i dodamo istu u Update()
void RotiranjeIgraca() {
float misX = Input.GetAxisRaw("Mouse X") * osjetljivostMisa;
float misY = Input.GetAxisRaw("Mouse Y") * osjetljivostMisa;
transform.rotation = Quaternion.Euler
(transform.rotation.eulerAngles + new Vector3(0, misX, 0));
kamera.rotation = Quaternion.Euler
(kamera.rotation.eulerAngles + new Vector3(-misY, 0, 0));}
22
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
PITANJA ZA PONAVLJANJE
Pitanja za ponavljanje
− Kakva je to komponentua Character Controller? Opišite ju.
− Je li potrebno koristiti dodatni sudarač kada koristimo komponentu Character
Controller? Zašto?
− Što radi metoda Input.GetAxis?
− Što je to vektor?
− Što vraća svojstvo magnitude (vektor)?
− Kako se normalizira vektor?
− Što daje svojstvo eulerAngles?

24
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
POMICANJE NA TEMELJU ROTACIJE
Kreiranje igrača – Pomicanje na temelju
rotacije
Trenutno su kontrole fiksne rotacije
Želimo postići kretanje u odnosu na rotaciju/pogled igrača
− Os Z (plava) – naprijed/natrag – vektor transform.forward
− Os X (crvena) – desno/lijevo – vektor transform.right
− Prilagodimo funkciju PomicanjeIgraca

26
Kreiranje igrača – Pomicanje na temelju
rotacije
ulazKretanje.x = Input.GetAxis("Horizontal");
ulazKretanje.z = Input.GetAxis("Vertical");

Vector3 ulazX = transform.right * Input.GetAxis("Horizontal");


Vector3 ulazZ = transform.forward * Input.GetAxis("Vertical");
ulazKretanje = ulazX + ulazZ;

27
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
ISPRAVNO POMICANJE KAMERE
Kreiranje igrača – Ispravno pomicanje
kamere
Dolazimo do sljedećeg problema:
− glavna kamera je dijete objekta igrača, objekt kamere se
automatski pomiče s objektom igrača
− Ovo može dovesti do neželjenih trzaja
− Pomak kamere radi istovremeno kao i pomak igrača:
metoda Update()
− Dobra praksa: pomak kamere raditi u zasebnoj metodi:
LateUpdate()
− Izdvojiti objekt glavna kamera izvan objekta igrača
− U objektu igrača kreirati novi objekt Pozicija kamere
(0,1.6,0)
− Kreirati novu skriptu KameraPratiIgraca, dodati ju na glavnu
kameru

29
Kreiranje igrača – Ispravno pomicanje
kamere
public Transform pozicijaKamere;
void LateUpdate() {
transform.position = pozicijaKamere.position;
transform.rotation = pozicijaKamere.rotation;}

30
Kreiranje igrača – Ispravno pomicanje
kamere
Snimite skriptu te varijablu pozicijaKamere postavite na prazan objekt Pozicija kamere
koji se nalazi na objektu igrača

Na skripti Igrac Kretanje promijeniti objekt kamere na objekt Pozicija kamere

31
Kreiranje igrača – Ispravno pomicanje
kamere
− Prednosti ovog pristupa:
− osiguravamo ispravan redoslijed izvođenja funkcija za ažuriranje pozicije igrača i
pozicioniranje kamere
− dobivamo glatke pomake objekata bez ikakvih trzaja

32
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
ZAKLJUČAVANJE KURSORA
Kreiranje igrača – Zaključavanje kursora
Kursor miša se trenutačno kreće slobodno prostorom ekrana (laka promjena fokusa na
drugu aplikaciju)
− Upravljanje likom videoigre se vrši korištenjem miša (videoigra iz prvog lica)
− Želimo sakriven i zaključan miš na sredinu ekrana (nemoguće napustiti prozor
videoigre povlačenjem miša)
− Funkcionalnost: nema ovisnost s kretanjem igrača - Kreiramo novu skriptu
− Skripta: UpraviteljVideoigre - zadužena za upravljanje stanjima videoigre
− Za ovu funkcionallnost koristimo metodu Start() – početak izvođenja videoigre

34
Kreiranje igrača – Zaključavanje kursora
void Start() {
Cursor.lockState = CursorLockMode.Locked;}

Klasa Cursor definira način rada kursora:


− Locked: kursor je nevidljiv, zaključana pozicija unutar ekrana na sredinu
− Confined: kursor je vidljiv, ne može napustiti prozor videoigre
− None: kursor je vidljiv, slobodno može napustiti prozor videoigre

35
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
PRIMJENA GRAVITACIJE
Kreiranje igrača – Primjena gravitacije
Trenutno na igrača ne primjenjujemo nikakvu silu koja bi ga spustila na tlo
− Gravitacijsku silu simuliramo putem osi Y
− U skripti IgracKretanje kreiramo varijablu gravitacija

public float gravitacija;

− Vrijednost varijable gravitacija postavite na 1 (određuje jačinu gravitacije)


− Gravitaciju projekta postavite na -30 po Y osi (Project Settings > Physics > Gravity)

37
Kreiranje igrača – Primjena gravitacije
public float gravitacija; Javna varijabla gravitacija
void PomicanjeIgraca(){
float ulazY = ulazKretanje.y;
Vector3 ulazX = transform.right * Input.GetAxis("Horizontal");
Vector3 ulazZ = transform.forward * Input.GetAxis("Vertical");
ulazKretanje = ulazX + ulazZ;
if (ulazKretanje.magnitude > 1){
ulazKretanje=ulazKretanje.normalized; Ako je igrač na tlu gravitacija
} ima inicijalnu silu
ulazKretanje = ulazKretanje * brzinaKretanja;
ulazKretanje.y = ulazY; ulazY pridružuje trenutni pomak osi Y natrag u ulazKretanje.y
if (cc.isGrounded) { Provjeravamo da li je igrač na tlu ili u zraku
ulazKretanje.y = Physics.gravity.y * gravitacija * Time.deltaTime;}
else { ulazKretanje.y += Physics.gravity.y * gravitacija * Time.deltaTime;}
cc.Move(ulazKretanje * Time.deltaTime);
} Ako nije, postepeno povećavamo snagu gravitacije
38
(brzina pada raste s vremenom)
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
SKAKANJE
Kreiranje igrača – Skakanje
U skripti IgracKretanje kreiramo varijable: jacinaSkoka, tipkaSkok, skok
public float jacinaSkoka;
public KeyCode tipkaSkok = KeyCode.Space; KeyCode definira tipku za skok (Space)
private bool skok; Definira je li skok izvediv ili ne

Mehaniku skakanja implementiramo u metodi PomicanjeIgraca


skok = cc.isGrounded; Da li je igrač u zraku ili na tlu (true/false)
if (Input.GetKey(tipkaSkok) && skok) { Provjeravamo da li je pritisnuta tipka za
skok i da li je igrač na tlu, ako je istina
skok = false; skok postavljamo na false i postavljamo
ulazKretanje.y = jacinaSkoka; vector kretanja po osi Y na zadanu jačinu
} skoka

cc.Move(ulazKretanje * Time.deltaTime); Izvodimo metodu koja pomiče igrača

40
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
DVOSTRUKI SKOK
Kreiranje igrača – Dvostruki skok
Kada trebamo omogućiti izvođenje drugog skoka?
− Potrebna nam je varijabla dvostrukiSkok
private bool dvostrukiSkok;

Implementacija (PomicanjeIgraca):
skok = cc.isGrounded;
if (Input.GetKey(tipkaSkok) && skok) {
skok = false;
dvostrukiSkok = true; Ako smo već skočili vrijednost postavljamo na true
ulazKretanje.y = jacinaSkoka;}
Provjera da li je
else if (Input.GetKeyDown(tipkaSkok) && dvostrukiSkok) { pritisnuta tipka za
dvostrukiSkok = false; Zabrana skakanja skok drugi put
ulazKretanje.y = jacinaSkoka;}
cc.Move(ulazKretanje * Time.deltaTime);

42
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
TRČANJE
Kreiranje igrača – Trčanje
Implementacija mogućnosti trčanja
−Potrebna nam je brzina trčanja i tipka koja aktivira trčanje
−U skripti IgracKretanje implementiramo sljedeći kod:
public float brzinaTrcanja;
public KeyCode tipkaTrcanje = KeyCode.LeftShift;

−Do sada smo ulazKretanje množili sa brzinaKretanja


−Sada vršimo provjeru da li držimo tipku za trčanje (left shift), ako da
množimo sa brzinaTrcanja
if (Input.GetKey(tipkaTrcanje)) {
ulazKretanje = ulazKretanje * brzinaTrcanja;}
else { ulazKretanje = ulazKretanje * brzinaKretanja;}

−Postavite brzinuTrcanja na 15
44
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
POMAK GLAVE IGRAČA
Kreiranje igrača – Pomak glave igrača
Funkcionalnost: lagano pomicanje glave igrača gore/dolje koje se
događa prilikom hodanja (implementacija unutar skripte IgracKretanje)

−glavaBrzina: definira brzinu pomicanja glave gore/dolje


private float glavaBrzina;

−glavaJacina: udaljenost pomaka glave


public float glavaJacina;

−pocetnaPozicija: koordinata početne pozicije glave (os Y)


private float pocetnaPozicija;

−tajmer: mjerenje vremena (baza za pomak glave)


private float tajmer = 0;
46
Kreiranje igrača – Pomak glave igrača
Metoda Start definira početnu poziciju objekta Pozicija kamere

void Start() {
pocetnaPozicija = kamera.position.y;
}

Vrijednost visine na kojoj se


Referenca na poziciju kamere u varijabli kamera
objekt nalazi (os Y)

47
Kreiranje igrača – Pomak glave igrača
Nova metoda PomicanjeGlave:
void PomicanjeGlave() {
if (Input.GetKey(tipkaTrcanje)) { Da li igrač trči?
glavaBrzina = brzinaTrcanja; Definiramo brzinu pomaka glave ovisno o trčanju ili
} else { hodanju igrača
glavaBrzina = brzinaKretanja;
} Da li je igrač u zraku ili na tlu (true/false)
Novi vektor
Vector3 ulazXZ = new Vector3 (ulazKretanje.x, 0f, ulazKretanje.z); kretanja
if (ulazXZ != Vector3.zero) { Ako se igrač kreće
tajmer += Time.deltaTime * glavaBrzina; Tajmer je proteklo vrijeme * brzina kretanja glave
(neovisnost o FPS-u)
kamera.transform.localPosition = new Vector3 Definiramo novu lokalnu poziciju objekta
(kamera.transform.localPosition.x, pocetnaPozicija + Mathf.Sin(tajmer) *
glavaJacina,kamera.transform.localPosition.z);
} Kako tajmer raste ukupna vrijednost naizmjenično raste i pada,
48
glavaJacine definira jačinu tog rasta i pada, x i z pozicije su prenesene
Kreiranje igrača – Pomak glave igrača
else { Ako se igrač ne kreće
tajmer = 0; Tajmer postavljamo na 0

kamera.transform.localPosition = new Vector Os x prenosimo iz objekta Pozicija kamere


(kamera.transform.localPosition.x,
Mathf.Lerp(kamera.transform.localPosition.y,pocetnaPozicija, glavaBrzina *
Time.deltaTime),kamera.transform.localPosition.z);
}
}
Os z prenosimo iz objekta Pozicija kamere Os y moramo linerano interpolirati uz pomoć funkcije Lerp.
Vraćamo poziciju glave nakon prestanka kretanja na početnu
poziciju.

Poziciju mijenjamo samo na lokalnom nivou (Pozicija kamere) jer je dijete igrača

49
Kreiranje igrača – Pomak glave igrača
Izvođenje metode za pomak glave pozivamo u
metodi Update

void Update() {
PomicanjeIgraca();
RotiranjeIgraca();
PomicanjeGlave(); }

Snimite skriptu, postavite vrijednost glavaJacina na


0.1

50
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
MEHANIKA PUCANJA
Mehanika pucanja
Temeljna mehanika videoigre pucanja iz prvog lica
− Kreiranje objekta oružja (dijete objekta Pozicija kamere)
− Pozicija objekta Oružje (0.15, 0.15, 0.7)
− Unutar objekta Oružje kreirati objekt kocke (3D Object > Cube)
pod nazivom Izgled (veličina: 0.15, 0.15, 0.7), materijal boja
(#222222)
− Unutar objekta Oružje kreirati objekt pod nazivom
MjestoIspucavanja (pozicija: 0, 0, 0.43)

52
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
METAK
Mehanika pucanja - Metak
Kreacija predloška objekta metka
− Na sceni kreirajte novu kocku (3d Object > Cube), Metak igrača
− Novi direktorij Predlosci (odvuci Metak igrača u direktorij)
− Uređivanje predloška (veličina metka: 0.1, 0.1, 0.2), novi
materijal boje (#C60032), dodijelite ga objektu metka
− Ukjučite opciju ls Trigger na komponenti Box Collider
− Pomicanje metka će koristiti simuliranu fiziku: na objekt metka
dodajemo komponentu Rigidbody (isključi opciju ‘Use gravity’)
− Svojstvo Interpolate postavite na Interpolate

54
Mehanika pucanja - Metak
Kreirajte novu skriptu Metak, dodijelite ju predlošku metka
− brzina: brzina kretanja metka
public float brzina;
− trajanje: vrijeme nakon kojeg je metak uništen
public float trajanje;
− rb: reference na komponentu Rigidbody
private Rigidbody rb;
U metodi Awake dohvaćamo referencu na Rigidbody:
void Awake() {
rb = GetComponent<Rigidbody>();
}
55
Mehanika pucanja - Metak
U metodi start dodajemo silu nad objektom metka (kretanje)

void Start() {
rb.AddForce(transform.forward * brzina, ForceMode.Impulse);
}
Vrsta sile: impuls

Metak se isto tako mora i uništiti, metoda Destroy

void UnistiMetak() {
Destroy(gameObject);
} 56
Mehanika pucanja - Metak
2 scenarija kada uništavamo metak
− Metak je udario u objekt videoigre
Metoda (OnTriggerEnter) se automatski poziva
void OnTriggerEnter(Collider other) { prilikom kolizije objekta s drugim objektima igre
UnistiMetak();
}

− Metak je ispucan u prazan prostor


void Start() {
rb.AddForce(transform.forward * brzina, ForceMode.Impulse);
Metoda Invoke poziva metodu za uništavanje metka
Invoke(nameof(UnistiMetak), trajanje);
nakon određenog vremenskog trajanja
} 57
Mehanika pucanja - Metak
Ispucavanje metka, nova skripta IgracPucanje (na objekt igrača)
− metak: referenca na objekt metka kojeg instanciramo
public GameObject metak;
− mjestoStvaranja: referenca na poziciju na kojoj ćemo instancirati metak
public Transform mjestoStvaranja;
Kroz metodu update implementiramo funkcionalnost ispucavanja metka:
void Update() {
if (Input.GetMouseButtonDown(0)) {
Instantiate(metak, mjestoStvaranja.position, mjestoStvaranja.rotation);}}

Ako igrač pritisne lijevu tipku miša instanciramo objekt metak na poziciji definiran sa varijablom
mjestoStvaranja 58
Mehanika pucanja - Metak
Snimite skriptu, vrijednosti varijabli postavite na:
− Brzina: 20
− Trajanje: 5
− Na skripti IgracPucanje varijablu metak postavite na predložak Metak Igrača
− Varijabla Mjesto stvaranja postavite na prazan objekt Mjesto ispucavanja
− Na objektu Oružje (Izgled) obrišite komponentu Box Collider (nije potreban na objektu
oružja kako se nebi sudario sa metkom)

59
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
PITANJA ZA PONAVLJANJE
Pitanja za ponavljanje
− Što radi komponenta Rigidbody?
Kako se dohvaća referenca na komponentu?
− Kako možemo dodati silu na objekt korištenjem komponente Rigidbody?
− Objasnite argumente metode AddForce.
− Kojom metodom možemo dohvatiti pritisak miša?
− Kada se izvršava metoda OnTriggerEnter?

61
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
DODAVANJE EFEKATA
Mehanika pucanja – Dodavanje efekata
Naglasujemo interakciju metka s okolnim objektima - trag metka koji će dodatno
metke učiniti vidljivijim

−U direktoriju Predlosci kreiramo novi predložak (desni klik > Create > Prefab), PS
Udarac metka
−Na vršnom objektu dodajte komponentu Particle System
−Duration: 1 Modul Emission Modul Velocity over lifetime
−Isključiti Looping − Rate over time: 0 − Linear (os Z): -3
−Start Lifetime: 0.5 − Dodaj Burst Modul Size over lifetime
−Start Speed: 1.5 − Count: 20 − Size: krivulja koja će veličinu
−Start Size: 0.1 i 0.2 Modul shape čestica smanjivati tijekom
−Start Color: #AB1414 − Sphere vremena trajanja čestica
−Gravity Modifier: 0.5 − Radius: 02 Modul Renderer
−Stop Action: Destroy − Material: Default-Line

63
Mehanika pucanja – Dodavanje efekata
U skripti Metak dodajemo nove varijable
− PSUdarac: refrenca na objekt predloška kreiranog efekta
public GameObject PSUdarac;
− pomakPS: pomak u poziciji instanciranja efekta
public float pomakPS;

void OnTriggerEnter(Collider other) {


Instantiate(PSUdarac, transform.position -
transform.forward * pomakPS, transform.rotation);
UnistiMetak();
}
Moramo osigurati da se efekt prikaže, najčešće je kolizija unutar
objekta, pa se efekt mora prikazati ispred objekta kolizije
64
Mehanika pucanja – Dodavanje efekata
Snimite skriptu
−Varijablu PS Udarac postavite na predložak
kreiranog sustava čestica PS Udarac metka
−Varijablu Pomak PS postavite na 0.7

65
Mehanika pucanja – Dodavanje efekata
Sljedeći vizualni efekt je trag metka (povećana vidljivost metka)
−Kreirajte materijal Trag
−Render mode: Fade
−Boja: #FFEE00
−Alpha: 130
−Emission: uključeno, ista boja
Na predložak metka dodajte komponentu Trail Renderer
(iscrtavanje traka prilikom micanja objekta)
−Vršna vrijednost: 0.05
−Ključna točka na kraju linije: 0
−Izravnajte liniju
−Time: 0.2
−Polje s materijalima: Trag
−Cast Shadows: Off
66
Mehanika pucanja – Dodavanje efekata
Sprječavanje kolizije između metaka
−Pogled za definiranje slojeva (Layers > Edit > Layers)
−Novi sloj Metci
−Edit > Project > Settings > Physics
−Matrica detekcije kolizije: isključite međusobnu koliziju u
sloju Metci

67
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
CILJNIK
Mehanika pucanja – Ciljnik
Ciljnik je osnovna i esencijalna funkcionalnost igara koje imaju
tematiku pucanja projektila (metci, topovi, strelice, magija itd.)
Potrebno nam je korisničko sučelje:
−GameObject > UI > Canvas, nazovite ga Korisničko sučelje
−Na komponenti Canvas Scaler
−UI Scale Mode: Scale With Screen Size (ref. 1920 x
1080)
−Kreirajte direktorij Sprajtovi, u njega učitajte sliku ciljnika
(pripremljeno u materijalima ili pak pronađite na internetu)

69
Mehanika pucanja – Ciljnik
Uvezenu sliku prilagodite putem prozora Inspector:
−Texture Type: Sprite (2D and UI)
−Alpha Is Transparency
−Filter Mode: Point (no filter)
−Na korisničko sučelje dodajte sliku (UI > Image), Ciljnik
−Na objektu Ciljnik (komponenta Image)
−Source Image: sprite ciljnika
−Boja: #00FF00 ili po želji
−Set native size

70
Mehanika pucanja – Ciljnik
Metak trenutačno putuje u odnosu pozicije oružja a ne
ciljnika (nije u ravnini ciljnika)
Uz pomoć metode RayCast ćemo odrediti točku na objektu
ispred igrača prema kojoj treba metak letjeti
−(ako zraka udari u objekt, metak mora letjeti prema točki
sjecišta nevidljive zrake i tog objekta)
−DrawRay (prvo ćemo iscrtati vidljivu zraku koja će se
iscrtavati s pozicije kamere prema naprijed)
−Početna pozicija, smjer iscrtavanja boja zrake

71
Mehanika pucanja – Ciljnik
U skripti IgracPucanje kreiramo novu varijablu koja je
referenca na poziciju objekta Pozicija kamere
public Transform kamera;
U metodi Update iscrtamo zraku s pozicije kamere prema
naprijed dužine 30 prostornih jedinica
Debug.DrawRay(kamera.position, kamera.forward * 30f,
Color.red);
Snimite skriptu te varijablu kamera postavite na objekt
Pozicija kamere

72
Mehanika pucanja – Ciljnik
if (Input.GetMouseButtonDown(0)) { Je li igrač pritisnuo lijevu tipku miša
if (Physics.Raycast(kamera.transform.position, Je li zraka udarila objekt
kamera.transform.forward, out RaycastHit cilj, 30f)) {
mjestoStvaranja.LookAt(cilj.point);
} else { Točku kolizije zrake s objektom
sudara ćemo dohvatiti u varijablu cilj
Mjesto ispucavanja rotiramo
prema točki sudara
mjestoStvaranja.LookAt(kamera.transform.position +
(kamera.transform.forward * 30f)); } 30f je najudaljenija točka do koje se
detektira kolizija
Instantiate(metak, mjestoStvaranja.position, mjestoStvaranja.rotation);
}

73
Mehanika pucanja – Ciljnik
− Metak uvijek trebao letjeti prema točki kolizije
koja se nalazi na poziciji ciljnika

− Ako do kolizije ne dođe, metak će biti ispucan


prema točki na sredini ekrana koja je udaljena za
30 prostornih jedinica prema naprijed u odnosu
na poziciju kamere

74
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
PITANJA ZA PONAVLJANJE
Pitanja za ponavljanje
− Kako se kreira vizualni efekt korištenjem čestičnog sustava?
− Objasnite ukratko module čestičnog sustava.
− Na koji način možemo onemogućiti detekciju kolizije između dva objekta.
− Što je to platno (Canvas)?
− Što radi metoda RayCast?
− Što radi metoda DrawRay?
− Što radi metoda LookAt?

76

You might also like