Unity 协程之三种分析解决StopCorotine终止不了
1、 打开 Unity,新建一个工程,具体如下图

2、在工程中,新建一个脚本,然后双击或者右键打开脚本,进行编辑,具体如下图


3、首先使用常用的方法,StartCoroutine(Func()),StopCoroutine(Func())的方法开启和停止一个协程,具体代码如下

4、脚本编译正确后,回到Unity界面,在场景中添加一个 GameObject ,把脚本挂载上去,运行场景,在 2 秒打印后,停止协程按钮,发现 5 秒过后,依然有打印,所以这种传统方法停止协程是不行,具体如下图


5、回到代码,编写第二种开启,停止协程的方法,StartCoroutine(“FuncName”),StopCoroutine("FuncName"),然后脚本编译正确后,回到Unity界面,运行场景,在 2 秒打印后,停止协程按钮,发现 5 秒过后,没有了打印,所以这种方法停止协程是可行的,具体如下图


6、回到代码,编写第三种开启,停止协程的方法,IEnumerator wrapFunc,包装一下协程函数,StartCoroutine(wrapFunc),StopCoroutine(wrapFunc),然后脚本编译正确后,回到Unity界面,运行场景,在 2 秒打印后,停止协程按钮,发现 5 秒过后,没有了打印,所以这种方法停止协程是可行的,具体如下图


7、StopCoroutineTest 脚本的具体代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StopCoroutineTest : MonoBehaviour {
IEnumerator wrapTest;
// Use this for initialization
void Start () {
wrapTest = Test();
//StartCoroutine(Test());
//StartCoroutine("Test");
StartCoroutine(wrapTest);
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.Space)) {
//StopCoroutine(Test());
//StopCoroutine("Test");
StopCoroutine(wrapTest);
Debug.Log("StopCoroutine(wrapTest)");
}
}
IEnumerator Test() {
yield return new WaitForSeconds(2.0f);
Debug.Log("2.0f Print");
yield return new WaitForSeconds(5.0f);
Debug.Log("5.0f Print");
}
}