E’ chiaro che alcune funzioni di Unity siano state sviluppate più come “utilities mordi e fuggi” che vere e proprie funzioni ottimizzate.
Una di queste è sicuramente InvokeRepeating che permette di chiamare un metodo standard ogni tot secondi (e con un delay di partenza). Questa funzione però, se analizzata con Reflector, espone una problematica principale: si basa sulla Reflection che, a runtime, indubbiamente è un processo MOLTO lento e dispendioso. Per questo motivo il suo uso va effettivamente evitato.
In sostituzione a InvokeRepeating possiamo facilmente usare le Coroutines che invece sono state sviluppate e rese disponibili proprio per ottimizzazioni di questo tipo. Sento già i puritani parlare di “Coroutine sono il male” parlando di chiamata di funzioni nella FixedUpdate, Time.deltaTime, etc etc. ALT! Non è questo il post in cui parlaremo delle prestazioni delle Coroutine.
Quindi, la nostra funzione:
InvokeRepeating("Fire", 2.0f, 0.5f);
Diventa:
...
StartCoroutine("StartFireSequence_Enumerator");
...
IEnumerator StartFireSequence_Enumerator()
{
yield return new WaitForSeconds(2.0f);
while (true)
{
Fire();
yield return new WaitForSeconds(0.5f);
}
}