协程在启动,停止,再次启动后执行两次

时间:2016-10-08 14:53:22

标签: unity3d

我有一个用于动画光标的协同程序。协程看起来像这样

private IEnumerator AnimateCursor(Vector2 targetScreenPoint)
{
   while (true)
   {
      // Do animation stuff          

      Debug.Log(targetScreenPoint.ToString());
      yield return null;
   }
}

第一次启动协程时,一切正常。如果光标移动,我调用StopCoroutine("AnimateCursor")来停止协程,然后使用targetScreenPoint参数的新值再次启动协同程序。

当我再次启动协程时,动画光标仍会被绘制在原始位置,Debug.Log会打印targetScreenPoint的第一个和第二个值(这就是为什么我认为协程正在执行每次更新循环期间两次。)

如果我将StopCoroutine("AnimateCursor")替换为StopAllCoroutines(),它可以正常工作,第二次协程开始时,它只打印第二个值targetScreenPoint

有谁知道发生了什么事?

编辑:在调试器运行时光标仍然是动画的我错了。我认为问题在于StopCoroutine,但我不知道为什么。如果协程采用参数,是否有一种特殊的方法可以停止协程?

2 个答案:

答案 0 :(得分:1)

您需要使用StartCoroutine("AnimateCursor", targetScreenPoint); - 字符串差异。

因为StopCoroutine("AnimateCursor")仅在您使用该字符串差异时才有效。

如果你使用StartCoroutine(AnimateCursor(targetScreenPoint)); - IEnumerator方差 - 则无法阻止你的协程。

答案 1 :(得分:-1)

选择为"正确"答案是不正确的。 StartCoroutine会返回Coroutine类型StopCoroutine,{{3}}可以接受作为备用重载来停止协同程序。

例如:

/// <summary>
    /// Not that it makes any sense to start a Coroutine just to stop it...
    /// </summary>
    public void StartAndThenImmediatlyStopCoroutine()
    {
        Coroutine coroutine = StartCoroutine(MyCoroutine());
        StopCoroutine(coroutine);
        Coroutine anotherCoroutineExample = StartCoroutine("MyCoroutine");//Ewww... String based co-routine starting. This breaks Find All References in Visual Studios so you can't actually know where it's being called.
        StopCoroutine(anotherCoroutineExample);
        Coroutine evenMoreCoroutine = StartCoroutine(MyCoroutineWithParamaters(1, 2.2f, "Paramater Routines Rock!!!"));
        StopCoroutine(evenMoreCoroutine);
    }

    public IEnumerator MyCoroutine()
    {
        yield return new WaitForSeconds(1.0f);
    }

    public IEnumerator MyCoroutineWithParamaters(int myNumber, float myFloat, string myString)
    {
        yield return new WaitForSeconds(1.0f);
    }