IEnumerator SomeCoroutine()
{
//Some logic
if (wait) yield return new WaitForSeconds(waitTime);
//Some more logic
if (wait) yield return new WaitForSeconds(secondWaitTime);
//Some more logic...
}
I use the same code for the game itself and for AI simulation.
The problem is that if the simulation is long, it will cause the main thread to freeze for a second sometimes.
If I separate the code for AI simulation, it will basically cause me a lot of duplicated code.
I simply want those coroutines to run as normal functions in another thread ( when “wait” value is false ).
IEnumerator is a C# interface that basically just has a way to MoveNext to a new element. StartCoroutine is a Unity specific way to loop through each element and perform some extra behaviour based on the output, but you can just do the looping yourself and ignore the output entirely if you want. Here’s an example:
void Start () {
StartCoroutine(LoggingCoroutine("Unity coroutine"));
StartQuickCoroutine(LoggingCoroutine("Quick coroutine"));
}
// This one runs all the code in the Enumerator as usual but doesn't do anything with the values that are being yielded
private void StartQuickCoroutine(IEnumerator enumerator)
{
while (enumerator.MoveNext())
{
//Just keep going
}
}
IEnumerator LoggingCoroutine(string whoAmI)
{
yield return new WaitForSeconds(5);
Debug.Log(whoAmI + " is finished");
}
The great thing about this is that is doesn’t even require you to say whether you want to wait or not, as nothing is going to do the wait logic if you loop through it yourself.