我有一个用于动画光标的协同程序。协程看起来像这样
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
,但我不知道为什么。如果协程采用参数,是否有一种特殊的方法可以停止协程?
答案 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);
}