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;
}