This is an old revision of the document!
Interactiunea cu obiectele in spatiul 3D poate fi extrem de complexa, intrucat exista foarte multe forme de interactiuni: inamici, obiecte de pickup, deschidere de usi, activare de manivele etc. Fiecare dintre aceste interactiuni are specificul ei, dar abstractizand, putem deduce ca fiecare interactiune se intampla intr-o anumita raza si cu un anumit punct de interactiune. Pentru a defini usor aceste lucruri, putem crea o clasa generica denumita InteractionObject
cu o metoda abstracta (virtuala) ce defineste interactiunea in detaliu.
public class InteractionObject : MonoBehaviour { public float radius = 1f; public Transform interactionPoint; Transform interactionObject; bool done = false; //metoda abstracta, speficica fiecarui tip de interactiuni public virtual void Interaction () { } void Update () { float distance = Vector3.Distance(interactionObject.position, interactionPoint.position); if (distance <= radius && !done) // avem interactiune cu obiectul, pot sa afisez informatii: de ex "Press E to use" { done = true; Interaction(); } } } }
Astfel, toate obiectele ce vor avea interactiuni, vor mosteni aceasta clasa. Spre exemplu pentru un obiect de pickup putem avea urmatoarea secventa:
public class PickupObject : InteractionObject { public override void Interaction() { base.Interaction(); // se apeleaza metoda parinte, in caz ca avem ceva generic //mecanica ... //distrugem obiectul Destroy(gameObject); } }
Pentru a controla mai bine zona de actiune (radius) si punctul de interes pentru un obiect de interactiune (InteractionObject), se poate defini o functie de editor, atunci cand obiectul este selectat. In exemplul de mai jos, la selectarea obiectului se va afisa o sfera wireframe de culoare alba.
void OnDrawGizmosSelected () { Gizmos.color = Color.white; Gizmos.DrawWireSphere(interactionPoint.position, radius); }