- Home /
Example of co-routine for documentation
In the Unity documentation it states:
Use Coroutines. The problem with Update calls is that they happen every frame. Quite possibly checking the distance to the player could be performed only every 5 seconds. This would save a lot of processing power.
http://unity3d.com/support/documentation/ScriptReference/index.Performance_Optimization.html
How would you set up a co-routine to execute every 5 seconds to toggle enabled
state of a behaviour?
Answer by ckfinite · Mar 03, 2012 at 06:55 PM
Try this (C#):
public class Example : MonoBehaviour {
public void Start() {
StartCoroutine(Enable());
}
public IEnumerator Enable() {
while (true) {
enabled = !enabled;
yield return new WaitForSeconds(5);
}
}
}
I am a little confused over this concept. Why does Enable
return an IEnumerator
when it has an infinite loop? $$anonymous$$any thanks!
Okay, how C# Enumerators work is rather on the weird side, I will get to why Unity uses them later, but the code you see there is not the actual code that gets executed. The code that gets executed is generated by the compiler, which takes that while loop inside the function and does complicated stuff so that the resulting function actually returns something (it becomes a whole class, actually). The reason Unity uses them is you can iterate through a enumerator, so Unity just iterates the enumerator whenever it finishes the old task, in the process executing your code. A more fluent explanation can be found here: http://csharpindepth.com/articles/chapter6/iteratorblockimplementation.aspx
That makes more sense, so presumably Unity steps the enumeration for you... Is each coroutine called once per Update
frame or FixedUpdate
frame or some other interval?
It is called whenever the previous iteration says to, like the WaitForSeconds command in the example. Otherwise, Unity never calls it without being asked to via StartCoroutine.
Your answer
![](https://koobas.hobune.stream/wayback/20220613064724im_/https://answers.unity.com/themes/thub/images/avi.jpg)