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