Professional Documents
Culture Documents
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)
6
Zadatak
Unutar okoline kreirajte (korištenjem objekta Cube):
−1 platformu
−3 stepenice
−3 kocke
−2 rampe
−1 zid
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))
11
NAPREDNE TEHNIKE RAZVOJA
VIDEOIGARA
KRETANJE IGRAČA
Kreiranje igrača - Kretanje
Os Z – definira smjer objekta prema naprijed / natrag
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)
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");
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
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;}
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
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
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;
−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)
void Start() {
pocetnaPozicija = kamera.position.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
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(); }
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
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();
}
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;
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
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