This shows you the differences between two versions of the page.
|
pjv:laboratoare:2023:06 [2023/11/13 16:04] 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). | ||
| Line 125: | 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) | ||