上一章介绍了通过函数的方式启动的协程,这一章我们测试一下用函数名启动的协程,代码如下:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CorTest : MonoBehaviour {
private void Start()
{
StartCoroutine("Normal");
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.J))
{
Debug.Log("【CorTest】Update 按下j键");
StopCoroutine("Normal");
}
}
IEnumerator Normal()
{
int f = 0;
while (true)
{
yield return new WaitForSeconds(1f);
f++;
Debug.Log(string.Format("【CorTest】Normal 运行一次协程,f值:" + f));
}
}
}同样的, 停止我们测试 两种方式,先看 第一种,用函数名停止的方式:

结果表明,用这种方法停止协程是可行的,那么用函数停止的方法呢?修改代码后再测试:

可以看到,并没有作用。。。那么至此我们可以推测:不管用何种方式启动协程,都不能通过函数的方式去结束它。
因为这里还只是测试了无参数的情况,为了更加可靠,接下来还需要测试一下多参数的情况(当然,还有一种上一章节用到的用变量停止的方式这里没有说,大家可以自行测试,结果肯定是能够停止的),修改代码如下,接下来一些小地方就不再粘贴测试结果了:


停止协程的方式我们还是先说用函数名形式停止的情况, 停止代码是:StopCoroutine("Normal"); //不需要写上参数(函数都只允许你传入一个参数。。。)结果是可以停止协程。
而使用函数的形式停止,代码是:StopCoroutine(Normal("TestCor"));//这里 必须带参数了(毕竟Normal是一个有参数的函数。。。)结果是不可以停止协程。
后面的结果已经可以想见了,但是我还是不放心,接着就像测试一下两个参数以及带委托的参数的情况,然而很快你就会发现,用函数名启动的方式不允许传入 一个以上的参数。。。这也就是说你 想启动带一个以上参数的协程就必须 使用上一章提到的方式,且停止方法只能是用变量来停止。既然两个参数不用测试了,那么就测试一下参数是委托的形式怎么办:
首先在编码过程中你就 会发现, 用函数名启动的 方式,参数不能用lambda表达式,所以你只有怪怪地去定义委托变量去赋值,这里用自定义的委托来测试:

结果当然是可以停止的, 且输出的代码与上一章的测试一样:

总结:
通过函数名的形式启动的协程,无法通过 函数的形式去结束,但是可以通过函数名的形式去结束,而用这种方式启动的协程最多允许带有一个参数(参数是委托的情况下,不允许使用lambda表达式)而想要使用带多个参数的协程,就只有使用第一章 讲到的用函数的方式去启动,并通过变量去 停止。
















