Unity 3D Italia

OnTriggerExit su oggetti distrutti

Può capitare di dover sapere quando un oggetto esce da una determinata area perché distrutto.
Come sappiamo per rilevare quando un oggetto esce da un’area trigger possiamo usare la funzione OnTriggerExit.

Ma se proviamo a cancellare (distruggere) un oggetto che era in contatto con un determinato trigger noteremo che la funzione OnTriggerExit non verrà richiamata, perché appunto, l’oggetto è stato distrutto e la rilevazione d’uscita non può più avvenire correttamente anche se in realtà l’oggetto, essendo stato distrutto, non è più a contatto con il trigger ed è dunque in effetti, uscito dal suo contatto.

Per ovviare a questo problema dovremmo usare uno stratagemma.
Nello script del trigger che dovrà rilevare la distruzione di un oggetto che era precedentemente in contatto con esso, ci mettiamo questo script:

using UnityEngine;


    public class MyObject : MonoBehaviour
    {

        bool triggered = false;
        Collider col;
        
        //L'entrata in contatto funziona come sempre
        //andiamo però ad impostare i due parametri necessari
        private void OnTriggerEnter(Collider other)
        {
            triggered = true;
            col = other;
            
            //Mettere qui il codice per OnTriggerEnter

        }
        
        //La nostra funzione, sostitutiva del OnTriggerExit 
        private void OnTriggerDestroy()
        {
            triggered = false;
            
            //Mettere qui il codice per OnTriggerExit

        }



        void Update()
        {
            
            if (triggered && !col)
            {
                OnTriggerDestroy();
            }

   
        }
    }

Cosa succede in questo script è abbastanza intuibile.
Nel metodo Update (dunque ad ogni frame) andremo a fare un doppio controllo, (triggered && !col), ovvero se esiste un collider impostato all’entrata in contatto (coll)  e che esso sia ancora esistente. Quando esso non lo sarà più, verrà eseguita la funzione OnTriggerDestroy();
Dunque nel momento in cui coll sarà stato distrutto esso risulterà null e verrà eseguita la funzione OnTriggerDestroy(); come se fosse un OnTriggerExit();
Tale funzione verrà eseguita una singola volta nel momento della distruzione dell’oggetto perché avremmo impostato su false la variabile triggered che tornerà su true solo ad un nuovo contatto con questo oggetto.

Exit mobile version