Differences

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

Link to this comparison view

pjv:laboratoare:2023:06 [2023/10/23 10:06]
alexandru.gradinaru
pjv:laboratoare:2023:06 [2024/10/07 10:49] (current)
alexandru.gradinaru
Line 1: Line 1:
-===== Interactiuni cu obiecte =====+===== 6. Interactiuni cu obiecte =====
  
 ==== Cerinte ===== ==== Cerinte =====
  
-TBU+Implementati intr-o scena Unity urmatoarele obiecte de interactiune:​ 
 +  * o zona invizibila care atunci cand esti in zona se afiseaza textul: "You are close!"​ 
 +  * in mijlocul zonei un colectibil care ii va creste viata personajului 
 +  * un turn care la atingere ii va scadea viata personajului si il va arunca putin inapoi (turnul nu poate fi distrus) 
 + 
 +Trebuie sa aveti un personaj controlabil de la tastatura, care sa aiba un atribut de viata (nu neaparat afisat pe ecran).
  
  
 ==== Documentatie video ===== ==== Documentatie video =====
-TBU+Inregistrare pe Teams
  
  
Line 66: Line 71:
  
 </​code>​ </​code>​
 +
 +==== OnCollision vs OnTrigger =====
 +
 +OnCollisionEnter:​ este apelat atunci când coliderul sau corpul rigid al unui obiect de joc a început să atingă coliderul sau corpul rigid al unui alt obiect de joc.
 +
 +În exemplul de mai jos, sfera și cubul au un colider implicit atașat pentru evenimentele de coliziune. Când sfera a intrat în coliziune cu cubul, OnCollisionEnter() este apelat și rulează codul pentru a schimba culorile pentru ambele obiecte.
  
  
 Astfel, toate obiectele ce vor avea interactiuni,​ vor mosteni aceasta clasa. Astfel, toate obiectele ce vor avea interactiuni,​ vor mosteni aceasta clasa.
 Spre exemplu pentru un obiect de pickup putem avea urmatoarea secventa: Spre exemplu pentru un obiect de pickup putem avea urmatoarea secventa:
 +
 +{{ :​pjv:​laboratoare:​2023:​collision.gif?​300 |}}
 +
 +
 +OnTriggerEnter:​ este apelat atunci când un obiect de joc cu un colider trece printr-un obiect de joc cu colider bifat „Is Trigger”.
 +
 +Obiectul cub are un colider implicit. Sfera are un colider de declanșare. Când sfera trece prin cub, OnTriggerEnter() este apelat și rulează codul pentru a schimba materialul sferei și a distruge cubul.
 +
 +{{ :​pjv:​laboratoare:​2023:​trigger.gif?​300 |}}
 +
 +
 +După cum putem vedea, există o diferență și utilizările sale.
 +
 +Dacă vrem să creăm un joc despre mașini care se lovesc una împotriva celeilalte pentru distrugere, atunci am folosi un colider implicit cu „Is Trigger” nebifat și am apela OnCollisionEnter prin scripting. Când două mașini se ciocnesc, va apela OnCollisionEnter pe ambele obiecte de joc. Ciocnirile permit, de asemenea, fizica obiectului de joc.
 +
 +Dacă vrem să colectăm obiecte sau poate să declanșăm o ușă sau un eveniment de cutscene, folosim un colider de verificare „Is Trigger” și apelăm OnTriggerEnter prin scripting. Când un jucător trece printr-un declanșator de coliziune cu trigger, poate începe un cutscene sau se deschide o ușă. Fizica este dezactivată pentru colizionare cu trigger.
 +
 +Ambele sunt la fel de importante și utilizate pentru diferite mecanici într-un joc video.
 +
 <​code>​ <​code>​
 public class PickupObject : InteractionObject { public class PickupObject : InteractionObject {
Line 100: Line 130:
 {{ :​pjv:​laboratoare:​gizmosselected.png?​direct&​750 |}} {{ :​pjv:​laboratoare:​gizmosselected.png?​direct&​750 |}}
  
-=== Referinta globala la player === 
- 
-O problema in programarea interactiunilor este detectarea player-ului,​ in sensul de referinta. Astfel, avem mai multe variante: 
-  * putem cauta un obiect dupa tag/nume etc. 
-  * 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 interes: 
- 
-<​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>​ 
- 
- 
- 
-=== 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 |}} 
-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) 
  
pjv/laboratoare/2023/06.1698044786.txt.gz · Last modified: 2023/10/23 10:06 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