Differences

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

Link to this comparison view

pjv:laboratoare:2022:03 [2022/11/09 11:51]
alexandru.gradinaru
pjv:laboratoare:2022:03 [2022/11/10 15:05] (current)
alexandru.gradinaru
Line 7: Line 7:
 <note tip>​Resurse folosite: <note tip>​Resurse folosite:
   * [[https://​assetstore.unity.com/​packages/​3d/​environments/​fantasy/​fantasy-forest-environment-free-demo-35361|Fantasy Forest Environment - Free Demo]]   * [[https://​assetstore.unity.com/​packages/​3d/​environments/​fantasy/​fantasy-forest-environment-free-demo-35361|Fantasy Forest Environment - Free Demo]]
 +  * [[https://​assetstore.unity.com/?​category=3d%2Fenvironments%5C3d%2Fvegetation&​free=true&​orderBy=1|3D Environments - vegetatation]]
 +  * [[https://​assetstore.unity.com/​packages/​3d/​environments/​fantasy/​canon-tower-50215|Canon tower]]
 +  * [[https://​assetstore.unity.com/​packages/​3d/​environments/​fantasy/​awesome-stylized-mage-tower-53793|Canon tower 2]]
 +  * [[https://​assetstore.unity.com/​packages/​3d/​environments/​stylized-fantasy-house-153587|Fantasy house]]
 +  * [[https://​assetstore.unity.com/​packages/​3d/​environments/​fantasy/​fantasy-kindom-building-pack-lite-78378|Fantasy kingdom]]
 +  * [[https://​assetstore.unity.com/​packages/​3d/​environments/​fantasy/​baker-s-house-26443|Baker house]]
 </​note>​ </​note>​
  
-Realizati o scena de joc similara cu un joc de Duck Hunt 3D+Realizati o scena de joc similara cu un MOBA (ex Dota 2, LoL, Smite etc.)
  
-  ​Mediul:  +  ​Mediul:  
-    ​un teren simplu si ceva vegetatie +    ​un teren cu 3 lane-uri 
-  ​Playerul: +    ​* turnuri pe fiecare lane (vedeti punctele rosii/​albastre ​de pe harta) - ar trebui sa fie diferentiate pe echipe (de ex un steag de culoare deferitasau culoare ​de material deferita ​etc.) 
-    ​- este reprezentat ​de o camera statica in scena (e suficient sa aveti doar camera, nu exista miscare din partea jucatorului) +    ​* cate o baza pentru fiecare player ​(de ex un steag de culoare deferitasau o culoare ​de material deferita ​etc.) 
-    ​are posiblitatea ​de a trage inspre inamici in 2 moduri: +{{ :​pjv:​laboratoare:​2022:​map_of_moba.svg.png |}} 
-      - left click: lanseaza ​un proiectil fizic care mere inspre directia une a fost apasat click (cu anumite reguli: fie are o durata ​de viatafie pana a nimerit ceva, fie adaugati ​forta combinata cu reguli ​de distrugere ​etc.) +  * Playerul are moduri de control. Schimbul intre cele doua moduri se poate face folosind ​tasta, sau la anumite evenimente definite de voi 
-      - right click: damage instant - se realizeaza cu un raycast dinspre camera spre inamic si atinge instant locul in care a fost apasat click +    - Navigatie: o camera 3rd person isometric sau top-down (similar moba - dotalol etc.care sa permita miscarea personajului pe harta in mod automat catre pozitia selectata cu mouse-ul 
-  - Inamicii: +    - Combat mode: o camera ​1st person 
-    ​- exista inamici 3D animati care se deplaseaza inspre camera incotinuu +  ​* Inamiciacestia sunt generati din timp in timp de la bazele fiecarei echipe si se misca automat pe unul din lane-uri catre baza celuilalt player
-    - inamicii se instantiaza ​(spawneaza) incontinuu (puteti pune anumite reguli - de ex sa fie max 5 in scena la un moment dat) intr-o zona din scena care sa fie vizibila ​de catre camera) +
-    - inamicii au comportament fizic (coloziunisunt afectati ​de gravitatie ​etc.) +
-    - inamicii au animatii posibile: run si hit (alergat, si animatie pentru cand au fost doborati/​atinsi) +
-    - inamicii sunt distrusi in momentul in care i-a nimerit playerul ​(cu o animatie scurtaapoi dispar din scena+
-    - inamicii se misca incontinuu spre player (camera) +
-  ​- GUI +
-    - In momentul ​in care au fost doborati 5 inamici, apare in mijlocul ecranului o imagine 2D animata +
-    - In momentul in care au fost doborati 10 inamici, apare in mijlocul ecranului o alta imagine 2D animata print-o metoda diferita fata de cea afisata ​la 5 inamici doborati+
  
 +<note important>​
 +Momentan nu sunt necesare interactiuni. Acest laborator vizeaza doar miscarea/​controlul personajelor si al inimicilor. Vom aborda in laboratoare viitoare intaractiuni dintre obiecte/​inamici etc. 
 +
 +Puteti folosi mecanica de tras implementata in laboratorul 2.
 +</​note>​
  
 ==== Documentatie video ===== ==== Documentatie video =====
Line 48: Line 51:
 === CharacterController === === CharacterController ===
  
-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.+CharacterController este o componenenta ce poate fi adaugata pentru a putea controla ​personajul. 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 150: Line 153:
     }     }
 </​code>​ </​code>​
- 
-==== Raycasting ==== 
- 
-In spatiul 3D testarea selectarii sau tintirii asupra unui obiect se face in general printr-o tehnica numita Raycasting, care presupune trasarea unei raze de la sursa (in general camera) la destinatie. Acest lucru este util atat pentru object picking (selectarea unui obiect in spatiul 3D cu mouse-ul spre exemplu) cat si pentru tintirea si lansarea de proiectile. 
- 
-Desi in cazul unui FPS, lansarea de proiectile se poate face si fizic (deci instantiez un proiectil care are damage, si ii imprim o forta cu care sa se deplaseze spre o directie), in general ea se simuleaza prin trasarea unei raze si detectia coliziuniii cu aceasta, si apoi aplicarea de efecte astfel incat impactul sa para real (proiectilul in general nu este vizibil ochiului uman). 
- 
-Pentru trasarea unei raze de la camera la o tinta se poate folosi functia de Raycast din pachetul de Physics oferit de Unity. Functia Raycast accepta o multitudine de variante de paramtri, in functie nevoia de utilizare, parametrii principali fiind punctul de start si directia. Un exemplu pentru o camera FPS si o tinta intr-un anumit range se poate folosi urmatoarea secventa de cod: 
- 
-<code c#> 
-RaycastHit hit; 
- 
-//daca am un obiect pe directia in range 
-if(Physics.Raycast(fpsCam.transform.position,​ fpsCam.transform.forward,​ out hit, range)) {  
-  //accesez un script de damage pe targetul meu daca accesta exista 
-  Enemy orc = hit.transform.GetComponent<​Enemy>​();​ 
-  if(orc!=null) { 
-    orc.TakeDamage(ammount);​ //​TakeDamage este o functie publica in scriptul de Enemy 
-    ​ 
-    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 
-  } 
-} 
-</​code>​ 
- 
-Asa cum se observa si in exemplul de mai sus, Racycast-urile se pot folosi in multe moduri. Cateva exemple: 
-  * aplicarea unei coliziuni 
-  * selectia unui obiect 
-  * tintirea unui obiect 
-  * actionarea unei functii din obiectul tintit 
-  * si altele 
- 
  
 ==== Navigare automata ==== ==== Navigare automata ====
Line 212: Line 180:
 ==== Agenti ==== ==== Agenti ====
  
-Pentru a programa ​inamici sau agenti NPC (Non-Playable Character) ​se poate folosi ​aceeasi ​functionalitate de navigare automata (NavMesh) si componenta de tip NavMeshAgent, pentru navigatie, similar cu sectiunea de Navigare automata din laboratorul precedent.+Pentru a programa ​o miscare automata pe harta se poate folosi ​aceasta ​functionalitate de navigare automata (NavMesh) si componenta de tip NavMeshAgent.
  
-Diferenta este ca acesti agenti vor raspunde automat la anumite evenimente: 
-  * inamicii de obicei incep sa interactioneze atunci cand player-ul intra intr-o anumita raza de actiune 
-  * NPC-urile interactoneaza la fel, bazate pe o raza de actiune sau efectiv interactiune directa (click) 
  
 === Inamici === === Inamici ===
- 
-Astfel, pentru inamici putem defini un controller cu un radius de actiune, si un gizmos pentru vizualizare usoara a acestuia in editor. 
- 
-<​code>​ 
-public class EnemyController : MonoBehaviour { 
- 
-  public float radius = 2; 
-  ​ 
-  void OnDrawGizmosSelected() { 
-    Gizmos.color = Color.red; 
-    Gizmos.DrawWireSphere(transform.position,​ radius); 
-  } 
- 
- 
-} 
-</​code>​ 
- 
-{{ :​pjv:​laboratoare:​enemy-radius.png?​500 |}} 
  
 Pentru ca un inamic sa se miste spre player, atunci cand player-ul intra in raza de actiune putem folosi componenta de NavMeshAgent Pentru ca un inamic sa se miste spre player, atunci cand player-ul intra in raza de actiune putem folosi componenta de NavMeshAgent
Line 283: Line 230:
 </​code>​ </​code>​
  
-O problema in activitatea agentilor este detectarea player-ului,​ in sensul de referinta. Astfel, avem mai multe variante: 
-  * putem cauta un obiect dupa tag 
-  * intr-o variabila target putem referentia direct player-ul (dar asta inseamna ca la fiecare agent trebuie mapat) 
-  * putem folosi un singleton in care se tine referentiaza playerul si poate fi accesat de oriunde 
  
-<​code>​ 
-public class PlayerManager : MonoBehaviour { 
-  
-  public static PlayerManager instance; 
-  public GameObject player; 
-    ​ 
-  void Awake() 
-  { 
-    instance = this; 
-  } 
- 
-} 
-</​code>​ 
- 
-Folosind varianta simpla cu singleton, putem lua pozitia player-ului de inters, similar cu laboratorul precedent: 
- 
-<​code>​ 
-target = PlayerManager.instance.player.transform;​ 
-</​code>​ 
- 
-Astfel, putem efectua usor operatii care tin de player - de exemplu putem orienta inamicii sau un npc cu fata catre player, in momentul unei interactiuni. 
- 
-<​code>​ 
- 
-        //Roteste cu 90 grade 
-        void RotateN() { 
-         ​Vector3 currentRotation = transform.rotation;​ 
-         ​Vector3 wantedRotation = currentRotation * Quaternion.AngleAxis(-90,​ Vector3.up);​ 
-         ​transform.rotation = Quaternion.Slerp(currentRotation,​ wantedRotation,​ Time.deltaTime * rotationSpeed);​ 
-        } 
-        //Roteste inamicul cu fata catre player ​ 
- void FaceTarget () 
- { 
- Vector3 direction = (target.position - transform.position).normalized;​ 
- Quaternion lookRotation = Quaternion.LookRotation(new Vector3(direction.x,​ 0, direction.z));​ 
- transform.rotation = Quaternion.Slerp(transform.rotation,​ lookRotation,​ Time.deltaTime * 5f); 
- } 
-</​code>​ 
  
 === Miscarea personajului la o destinatie point-and-click === === Miscarea personajului la o destinatie point-and-click ===
pjv/laboratoare/2022/03.1667987517.txt.gz · Last modified: 2022/11/09 11:51 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