【问题标题】:Unity StopCoroutine not workingUnity StopCoroutine 不起作用
【发布时间】:2017-09-01 23:53:55
【问题描述】:

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

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() 连接到一个按钮,所以我想停止当前的教程,如果用户一遍又一遍地按下它,然后重新开始。

目前发生的情况似乎是协同程序在彼此之上运行。

【问题讨论】:

  • 您是否尝试过在 if 语句下更改对 StopAllCoroutines 的调用?
  • 是的,我有,这不会改变任何事情
  • 删除StopAllCoroutines 看看会发生什么。最好展示一下wholeTutorialRoutine 是如何声明的
  • wholeTutorialRoutine = StartCoroutine(WholeTutorial()); 7 行下来
  • 我问它是如何声明的而不是它是如何初始化的。再次删除 StopAllCoroutines 时会发生什么?

标签: c# unity3d coroutine


【解决方案1】:

使用IEnumerator而不是CoroutineRunWholeTutorial协程函数的实例一次存储在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");
}

【讨论】:

  • 这部分工作.. RunWholeTutorial 连接到一个按钮,每次按下按钮它都会跳到 WholeTutorial 例程中的下一步。例如,如果“tap_to_kill”步骤刚刚发生,那么你按两次按钮,它会自动跳到“larger_enemies”步骤,而不是从头开始。
  • @BenjaFriend 要从头开始,您需要在StopCoroutine(wholeTutorialRoutine); 行之后再次调用wholeTutorialRoutine = WholeTutorial(); 来重置枚举器
猜你喜欢
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多