Unity StopCoroutine 不工作

Unity StopCoroutine not working

我有一个启动协程的方法,应该在再次启动之前停止它并重置一些东西。

private Coroutine wholeTutorialRoutine;

public void RunWholeTutorial()
{
    tutorialText.text = "";
    StopAllCoroutines();

    if(wholeTutorialRoutine != null)
    {
        StopCoroutine(wholeTutorialRoutine);
    }

    wholeTutorialRoutine = StartCoroutine(WholeTutorial());

}

private IEnumerator WholeTutorial()
{
    // Wait until after we are done showing this dialouge
    yield return StartCoroutine(ShowDialougForSeconds("tap_to_kill", 5f));

    yield return new WaitForSeconds(5f);

    yield return StartCoroutine(ShowDialougForSeconds("larger_enemies", 5f));

    yield return new WaitForSeconds(5f);

    yield return StartCoroutine(ShowDialougForSeconds("press_button", 7f));

    yield return new WaitForSeconds(3f);

    yield return StartCoroutine(ShowDialougForSeconds("button_colors", 5f));
}

private IEnumerator ShowDialougForSeconds(string diagID, float time)
{
    SetText(diagID);

    tutorialText.GetComponent<Animator>().SetTrigger("FadeIn");

    yield return new WaitForSeconds(time);

    tutorialText.GetComponent<Animator>().SetTrigger("FadeOut");
}

wholeTutorialRoutineCoroutine.

类型的私有字段

我觉得那些 WaitForSeconds 电话发生了一些奇怪的事情,但我不太确定是什么。

RunWholeTutorial() 连接到一个按钮,所以我想停止当前教程,如果用户一遍又一遍地按下它,则重新开始。

目前发生的事情似乎是协程 运行 相互叠加。

使用IEnumerator而不是Coroutine来存储RunWholeTutorial协程函数的实例一次Start函数中.然后,您可以使用 IEnumerator 变量启动和停止它。

private IEnumerator wholeTutorialRoutine;

void Start()
{
    wholeTutorialRoutine = WholeTutorial();
}

public void RunWholeTutorial()
{
    tutorialText.text = "";

    if (wholeTutorialRoutine != null)
    {
        StopCoroutine(wholeTutorialRoutine);
    }

    StartCoroutine(wholeTutorialRoutine);
}

private IEnumerator WholeTutorial()
{
    // Wait until after we are done showing this dialouge
    yield return StartCoroutine(ShowDialougForSeconds("tap_to_kill", 5f));

    yield return new WaitForSeconds(5f);

    yield return StartCoroutine(ShowDialougForSeconds("larger_enemies", 5f));

    yield return new WaitForSeconds(5f);

    yield return StartCoroutine(ShowDialougForSeconds("press_button", 7f));

    yield return new WaitForSeconds(3f);

    yield return StartCoroutine(ShowDialougForSeconds("button_colors", 5f));
}

private IEnumerator ShowDialougForSeconds(string diagID, float time)
{
    SetText(diagID);

    tutorialText.GetComponent<Animator>().SetTrigger("FadeIn");

    yield return new WaitForSeconds(time);

    tutorialText.GetComponent<Animator>().SetTrigger("FadeOut");
}