Coroutine does not seem to work

Hello,

I’m not very fond of coroutines yet, but here’s basically what I’m trying to do:
I want to change the color of a button (one out of four) for 1 second and I use states for that (Button_pressed = color, button_unpressed = no color). I change a bool variable in order to accomplish the state change.

Every round another button adds and I want to change the color of the buttons consecutively → I need to delay the state changes of the buttons 2,3,4… otherwise the state changes will overlap.

I’ve tried many things so far and currently I’m stuck here:

Update()
//Call GenerateNewButton() if the all the previous buttons have been displayed

GenerateNewButton()
//Generate new Random (1-4) for the button that’s supposed to change color and call PlayButton()

PlayButton()
//Call the recursive function PlayCurrentButton

PlayCurrentButton()
//Set Variable for the state change and call PlayCurrentButton again (with the next button) as long as there is a button to display

Here the exact code of the last function:

public void PlayCurrentButton(int Round)

{

    if (PublicClass.ButtonList[Round] == 1){

		AnimatorDown.SetBool("DownPressed",true);

	}

	else if (PublicClass.ButtonList[Round] == 2){

		AnimatorRight.SetBool("RightPressed",true);

	}

	else if (PublicClass.ButtonList[Round] == 3){

		AnimatorUp.SetBool("UpPressed",true);

	}

	else if (PublicClass.ButtonList[Round] == 4){

		AnimatorLeft.SetBool("LeftPressed",true);

	}
	
	
	StartCoroutine(WaitForAnimation(Round));

	if (Round != PublicClass.ButtonList.Count-1) {
		PlayCurrentRound(Round+1);
	}
}

IEnumerator WaitForAnimation(int Round)
{
	yield return new WaitForSeconds(10.0f);
}

The problem is, that the Coroutine does not seem to work, there is no delay and the state changes overlap. I’ve already read many similar discussions about coroutines but I just can’t seem to figure out the problem.

Thanks in advance ~

Your coroutine does nothing. Calling StartCoroutine from inside a normal function just starts that as a parallel track of execution and as it immediately waits and terminates.

If you wanted something to wait you would need to make the whole thing a coroutine or make a coroutine that does something after a period of time.

That latter can be achieved like this:

 public IEnumerator DoAfter(float delay, System.Action operation) {
       yield return new WaitForSeconds(delay);
       operation();
  }

And then you might call it in your code like this:

public void PlayCurrentButton(int Round)

{
 
    if (PublicClass.ButtonList[Round] == 1){
 
       AnimatorDown.SetBool("DownPressed",true);
 
    }
 
    else if (PublicClass.ButtonList[Round] == 2){
 
       AnimatorRight.SetBool("RightPressed",true);
 
    }
 
    else if (PublicClass.ButtonList[Round] == 3){
 
       AnimatorUp.SetBool("UpPressed",true);
 
    }
 
    else if (PublicClass.ButtonList[Round] == 4){
 
       AnimatorLeft.SetBool("LeftPressed",true);
 
    }
 
 
    StartCoroutine(DoAfter(10, ()=>{
      if (Round != PublicClass.ButtonList.Count-1) {
         PlayCurrentRound(Round+1);
      }
    }));
 
}