【发布时间】:2019-01-04 03:19:13
【问题描述】:
如果我使用一层yield return,StopCoroutine() 可以成功停止我的协程。请参阅下面的代码示例...
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestStopcoroutine : MonoBehaviour {
IEnumerator co = null;
// Use this for initialization
void Start () {
co = FunA();
StartCoroutine(co);
}
private IEnumerator FunA() {
Debug.Log("Enter FunA...");
yield return RepeatPrint();
Debug.Log("FunA end...");
}
private IEnumerator RepeatPrint() {
for (int i = 0; i < 5; i++) {
Debug.Log(i);
yield return new WaitForSeconds(1);
}
}
/// <summary>
/// Set this function to a button on UI Canvas
/// </summary>
public void OnCancelButtonClick() {
if (co != null) {
StopCoroutine(co);
Debug.Log("Stop Coroutine...");
co = null;
}
}
}
这个输出是...
// Enter FunA...
// 0
// 1
// 2
// 3
// Stop Coroutine...
但是,如果我添加一层(即FunB()),FunA() 将停止,但内部协程(FunB())不会停止。请看下面的示例代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestStopcoroutine : MonoBehaviour {
IEnumerator co = null;
void Start () {
co = FunA();
StartCoroutine(co);
}
private IEnumerator FunA() {
Debug.Log("Enter FunA...");
yield return FunB();
Debug.Log("FunA end...");
}
private IEnumerator FunB () {
Debug.Log("Enter FunB...");
yield return RepeatPrint();
Debug.Log("FunB end...");
}
private IEnumerator RepeatPrint() {
for (int i = 0; i < 5; i++) {
Debug.Log(i);
yield return new WaitForSeconds(1);
}
}
/// <summary>
/// Set this function to a button on UI Canvas
/// </summary>
public void OnCancelButtonClick() {
if (co != null) {
StopCoroutine(co);
Debug.Log("Stop Coroutine...");
co = null;
}
}
}
这个输出是...
// Enter FunA...
// Enter FunB...
// 0
// 1
// 2
// Stop Coroutine...
// 3
// 4
// FunB end...
所以,我想知道为什么StopCoroutine()不能成功停止多层yield return协程??
【问题讨论】:
-
你的 Unity 版本是什么?
-
我的 Unity 版本是 5.6.4p3
-
好的。看我的回答。只要您的第二个代码是您的实际代码,那么您的输出就是错误的。项目中有问题。请参阅我的回答,了解为什么会发生这种情况。如果您有任何问题,请在我的回答下留下