- Home /
How to make tow Coroutines calling each other
Hi. So I just learned about co rotines.
And I wanted two coroutines that whenever one finishes it calls the other. So I did this script:
void Start() {
StartCoroutine(CorOnAir());
}
IEnumerator CorOnGround() {
Debug.Log("Ground DoBefore");
while (!onAir) {
yield return new WaitForEndOfFrame();
Debug.Log("Ground DoWhile");
}
StartCoroutine(CorOnGround());
yield break;
}
IEnumerator CorOnAir() {
Debug.Log("Air DoBefore");
while (onAir) {
yield return new WaitForEndOfFrame();
Debug.Log("Air DoWhile");
}
StartCoroutine(CorOnAir());
yield break;
}
But It dosen't work.
Can somebody help with this?
Answer by Anis1808 · Dec 08, 2019 at 01:46 AM
Just change StartCoroutine(CorOnGround());
on line 13 to StartCoroutine(CorOnAir());
And StartCoroutine(CorOnAir());
on line 25 to StartCoroutine(CorOnGround());
and it should do the trick.
Whell that part made me feel strupid XD.
But for some reason it works until I place code outside the loop.
It gives a "NullReferenceException: Object reference not set to an instance of an object" error message.
The is no code that could possible cause a NullReferenceException. So if you get a null reference exception when you "add code" it's probably just an issue with "that code" you just added.
Apart from that starting new coroutines should be avoided if possible. Coroutines are actual objects which require memory and will produce garbage when they "finish". Especially since you want to have at least one running all the time it's better to just combine the two.
void Start()
{
StartCoroutine(SomeLogic());
}
IEnumerator SomeLogic()
{
while (true)
{
while (!onAir)
{
yield return null;
Debug.Log("Ground DoWhile");
}
while (onAir)
{
yield return null;
Debug.Log("Air DoWhile");
}
}
}
Also note that I replaced your "WaitForEndOfFrame" through a simple "null". WaitForEndOfFrame has just very special reasons to use. In almost all cases you do not want to use it. It waits until the whole frame is finished it's logic as well as rendering. So whatever you do here should only concern about post processing stuff. If it's about any kind of game logic you just want to have the coroutine run during the normal "logic" period before the frame gets rendered. Please have a look at the flowchart over here.
Your answer
Follow this Question
Related Questions
Collection Change During Iteration 0 Answers
Coroutines not passing yield 1 Answer
How to use Coroutines in C++/CLI? 1 Answer
StopAllCoroutines not working 0 Answers
Generating Objects at High Speeds 0 Answers