Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pjv:laboratoare:05 [2018/11/14 15:20]
alexandru.gradinaru
pjv:laboratoare:05 [2018/11/14 19:34] (current)
alexandru.gradinaru
Line 1: Line 1:
-===== Elemente de programare a jocurilor ​3D =====+===== Introducere in 3D =====
  
 ==== Controlul caracterelor in 3D ==== ==== Controlul caracterelor in 3D ====
Line 5: Line 5:
 Pentru miscarea si controlul caracterelor in 3D sunt posibile mai multe abordari. Pentru miscarea si controlul caracterelor in 3D sunt posibile mai multe abordari.
  
-=== Character Controller ​===+=== CharacterController ​===
  
-Character Controller ​este o componenenta ce poate fi adaugata pentru a putea controla caracaterul. Aceasta componenta nu foloseste elemente de fizica in nici nu fel, dar vine atasat cu un collider de baza ''​Capsule Collider''​ care nu permite intrarea in alte collidere. Acest lucru simplifica foarte mult scriptarea caracterului.+CharacterController ​este o componenenta ce poate fi adaugata pentru a putea controla caracaterul. Aceasta componenta nu foloseste elemente de fizica in nici nu fel, dar vine atasat cu un collider de baza ''​Capsule Collider''​ care nu permite intrarea in alte collidere. Acest lucru simplifica foarte mult scriptarea caracterului.
  
 Character Controller pune la dispozitie doua metode pentru miscarea caracterului: ​ Character Controller pune la dispozitie doua metode pentru miscarea caracterului: ​
Line 36: Line 36:
 </​code>​ </​code>​
  
-In cazul functiilor puse la dispozitie de Character Controller, miscarile sunt constranse de coliziuni in mod automatsi fiind destul de permisiva (spre exemplu va putea urca autmat rampe sau scari).+In cazul functiilor puse la dispozitie de Character Controller, miscarile sunt constranse de coliziuni in mod automat si este destul de permisiva (spre exemplu va putea urca autmat rampe sau scari).
  
 <​html>​ <​html>​
Line 91: Line 91:
 </​code>​ </​code>​
 Daca inputul nu este normalizat, caracterul se va misca cu o viteza mai mare atunci cand se misca in fi Daca inputul nu este normalizat, caracterul se va misca cu o viteza mai mare atunci cand se misca in fi
 +
 +
 +=== Rotatia camerei ===
 +
 +Pentru rotatia camerei exista mai multe variante, dar una dintre cele mai indiacate este sa retineti intotdeauna rotatia actuala a camerei, pentru a evita probleme legate de rotatii multiple compuse.
 +
 +O varianta simpla:
 +<​code>​
 +    private float yaw = 0.0f;
 +    private float pitch = 0.0f;
 +
 +    void Update () {
 +        yaw += speedH * Input.GetAxis("​Mouse X");
 +        pitch -= speedV * Input.GetAxis("​Mouse Y");
 +
 +        transform.eulerAngles = new Vector3(pitch,​ yaw, 0.0f);
 +    }
 +</​code>​
  
 ==== Raycasting ==== ==== Raycasting ====
Line 111: Line 129:
     ​     ​
     enemyHealthBar.SetActive(true);​ //pot afisa si Healthbar-ul inamicului la plasarea tintei pe acesta     enemyHealthBar.SetActive(true);​ //pot afisa si Healthbar-ul inamicului la plasarea tintei pe acesta
 +  }
 +  ​
 +  if(orc.rigidbody != null) {
 +    orc.rigidbody.addForce(-hit.normal * impactForce);​ //adauga o forta la impact
   }   }
 } }
Line 125: Line 147:
  
 Similar cu spatiul 2D, se pot folosi atat obiecte plasate in scena, cat si partea de Canvas, in ceea ce priveste interfata grafica. Similar cu spatiul 2D, se pot folosi atat obiecte plasate in scena, cat si partea de Canvas, in ceea ce priveste interfata grafica.
 +
 +=== FPS Gun ===
  
 Astfel, spre exemplu pentru un FPS single player, in general nu avem nevoie de caracter, ci doar de maini, sau eventual doar o arma animata. Astfel, spre exemplu pentru un FPS single player, in general nu avem nevoie de caracter, ci doar de maini, sau eventual doar o arma animata.
Line 139: Line 163:
 {{ :​pjv:​laboratoare:​crosshair2.png?​direct&​750 |}} {{ :​pjv:​laboratoare:​crosshair2.png?​direct&​750 |}}
  
-<hidden+=== Healthbar === 
-(vezi demo UI de la 3dpub+ 
-  coliziuniproiectile +Pentru reprezentarea healthbar-ului sau a altor elemente de tip bara, se poate folosi un element de UI (gameobject) de tip Slider, asa cum este reprezentat in imaginea de mai sus. 
-  interfata grafica pt un fps + 
-  - Managing weaponsNavmeshesnavmesh AgentsAI Auto-Attack +<code
-  ​- animatie caractere atacarmacoliziuni atac +GetComponent.<​Slider>​().value = myHealth; 
-</hidden>+</​code>​ 
 + 
 +=== Minimap === 
 + 
 +Pentru crearea unui minimap se foloseste ​de regula o camera suplimentara,​ plasata top-down deasupra scenei. 
 + 
 +{{ :​pjv:​laboratoare:​minimap1.png?​direct&​350 |}} 
 + 
 +Camera special creata va trebui sa afiseze scena intr-o textura. Pentru acest lucru vom folosi un asset de tip ''​Render texture''​ (//Assets -> Create -> Render Texture//pe care o vom atasa ca Target in camera nou creata. 
 + 
 +{{ :​pjv:​laboratoare:​minimap3.png?​direct&​350 |}} 
 + 
 +Pasul urmator este sa afisam Minimap-ul. Pentru acest lucruin canvas vom crea o imagine si vom lega textura in care salvam imaginile de la camera la aceasta. 
 + 
 +{{ :​pjv:​laboratoare:​minimap4.png?​direct&​350 |}} 
 + 
 +Rezultatul poate fi ibunatatit prin plasarea acestuia intr-un loc potrivit adaugarea unei masti sau a unei borduri si asa mai departe. 
 + 
 +{{ :​pjv:​laboratoare:​minimap7.png?​direct&​750 |}} 
 + 
 +==== Crearea de animatii pentru obiecte 3D ==== 
 + 
 +Crearea animatiilor se poate face folosind utilitarul de animatie (Window > Animation)similar ca in spatiul 2D. 
 +Similarse poate folosi Animator Controller pentru a gestiona starile (spre exemplu tras cu arma). 
 + 
 +<​code>​ 
 +void Update()  
 +
 +  if(Input.GetButtonDown("​Fire1"​)) 
 +  { 
 +    //set animation state 
 +    animator.SetInteger("​state"​STATE_SHOOTING);​ 
 +     
 +    //raycast & everything else .. 
 +    ​ 
 +  ​
 +
 +</​code>​ 
 + 
 +Daca vreti sa aveti actiunea de Fire incontinuuse poate folosi punctia de InputGetButton() 
 + 
 +<​code>​ 
 +void Update()  
 +
 +  if(Input.GetButton("​Fire1"​) && Time.time >= nextFire) 
 +  { 
 +    nextFire = Time.time + 1f/​fireRate;​ 
 +     
 +    //set animation state 
 +    animator.SetInteger("​state",​ STATE_SHOOTING);​ 
 +     
 +    //raycast & everything else .. 
 +  } 
 +} 
 +</code>
  
 +==== Cerinte ====
  
-<​hidden>​ +Realizarea unui joc 3D fps
-===== Elemente de programare a jocurilor ​3D ===== +
-- animatii cu blend tree+
  
 +  - Configurati scene pentru rulare 3D
 +  - Adaugati in scena un caracter FPS: o arma, un crosshair si camera plasata pentru a da impresia unui caracter (puteti lua resurse din asset store sau alte locuri: [[pjv:​resurse|]])
 +  - Caracterul se va putea controla de la tastatura si mouse. Folositi RigidBody sau CharacterController pentru control
 +  - Caracterul va avea o bara de viata
 +  - Arma 
 +      - va avea o mica animatie de miscare/​rotatie la Fire
 +      - va avea mai multe moduri de tragere, de ex: rifle (continuu) sau snipe (o data la apasarea de buton, cu damage mai mare)
 +  - Adaugati unul sau mai multi inamici in scena scriptati astfel incat:
 +      - sa aiba viata
 +      - la plasarea tintei(crosshair) pe acesta sa apara un healthbar
 +      - la actiunea de Fire a armei acesta va fi aruncat un pic inapoi si va pierde din viata
 +  - Adaugati un minimap
  
-</​hidden>​ 
pjv/laboratoare/05.1542201655.txt.gz · Last modified: 2018/11/14 15:20 by alexandru.gradinaru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0