Skip to content Skip to sidebar Skip to footer

Ottimizzare l’uso e la scrittura delle Coroutine di Unity attraverso le Action

Tutti coloro che utilizzano Unity prima o poi si scontrano con l’utilizzo delle Coroutine le quali permettono l’implementazione di attività asincrone ma soprattutto di attività ripetitive e governate da attesa di avvio e durata.
L’uso base delle Coroutine quindi passa dall’implementazione di una funzione di Enumerazione e una funzione di chiamata della stessa. La funzione di enumerazione poi è quella che include la logica di avvio e uscita della stessa, spesso con una direttiva di yield return new WaitForSeconds(…);

La scrittura di questa implementazione è spesso ripetitiva ma soprattutto occupa righe di codice che possono essere ottimizzate e soprattutto riportate inline (per non spezzare il flusso). Un buon modo per utilizzarle è quindi quello di creare una funzione che riceve in ingresso il tempo di attesa di avvio delle Coroutine e una Action che non è altro che una funzione (la quale verrà scritta inline), come in questo caso:

 public static IEnumerator CoroutineExecute(float wait, Action action)
        {
            if (wait > 0)
            {
                yield return new WaitForSeconds(wait);
            }
            action();
            yield return action;
        }

Per richiamare questa funzione utilizzeremo questa scrittura:

   StartCoroutine(CoroutineExecute(10, () =>
            {
                //Attività da eseguire tra 10 secondi qui...
            }));

Come si vede dall’esempio besterà chiamare la classica StartCoroutine passano la nostra funzione specificata dei secondi di attesa di avvio e la Action da eseguire (nient’altro che del codice inline).

Una possibile evoluzione della funzione può anche essere questa (che include due Action):

 public static IEnumerator CoroutineExecute(float wait, Action actionBefore, float duration, Action actionAfter)
        {
            if (wait > 0)
            {
                yield return new WaitForSeconds(wait);
            }
            actionBefore();
            if (duration > 0)
            {
                yield return new WaitForSeconds(duration);
            }
            actionAfter();
            yield return actionAfter;
        }