结束协同程序
通常,当符合某些目标时,你会设计协同程序以自然结束。
IEnumerator TickFiveSeconds()
{
var wait = new WaitForSeconds(1f);
int counter = 1;
while(counter < 5)
{
Debug.Log("Tick");
counter++;
yield return wait;
}
Debug.Log("I am done ticking");
}
为了从协同程序的内部停止协同程序,你不能简单地返回,因为你将从普通函数中提前离开。相反,你使用 yield break
。
IEnumerator ShowExplosions()
{
... show basic explosions
if(player.xp < 100) yield break;
... show fancy explosions
}
你还可以强制脚本启动的所有协同程序在完成之前停止。
void OnDisable()
{
// Stops all running coroutines
StopAllCoroutines();
}
从调用者停止特定协程的方法取决于你启动它的方式。
如果你通过字符串名称启动了一个协同程序:
StartCoroutine("YourAnimation");
那么你可以通过使用相同的字符串名称调用 StopCoroutine 来阻止它 :
StopCoroutine("YourAnimation");
或者,你可以保持一个参考或者由协同程序方法,返回的 IEnumerator
或通过 StartCoroutine
返回的 Coroutine
对象,并调用 StopCoroutine
在任的那些:
public class SomeComponent : MonoBehaviour
{
Coroutine routine;
void Start () {
routine = StartCoroutine(YourAnimation());
}
void Update () {
// later, in response to some input...
StopCoroutine(routine);
}
IEnumerator YourAnimation () { /* ... */ }
}