using UnityEngine;
using System.Collections;
//测试脚本,随意挂载,运行即可打印
public class Coroutine : MonoBehaviour
{
void Start()
{
//StartCoroutine(Test());
StartCoroutine(TestStartCoroutine());
}
IEnumerator TestNull()
{
//return null和return 任意一个数字的操作结果是一样的
yield return null;
Debug.Log("等下一帧中的update函数执行完后继续执行");
}
IEnumerator TestWaitForSeconds()
{
//等待3秒,一段指定的时间时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响);
yield return new WaitForSeconds(3);
Debug.Log("距离程序启动已经过了3s");
}
IEnumerator TestStartCoroutine()
{
//等待帧结束,等待所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
//yield return new WaitForEndOfFrame();
//等待某个协程(方法)执行完毕后再执行后续代码,比如要执行完TestWaitForSeconds方法以后再执行TestStartCoroutin
yield return StartCoroutine(TestWaitForSeconds());
Debug.Log("我在--“距离程序启动已经过了3s”--后被打印");
}
#region yiele return 介绍
/*
*yield return null; // 下一帧再执行后续代码(通常用于循环语句中)
*yield return 0; //下一帧再执行后续代码
*yield return 6;//(任意数字) 下一帧再执行后续代码
*yield break; //直接结束该协程的后续操作
*yield return asyncOperation;//等异步操作结束后再执行后续代码
*yield return StartCoroution(某个协程);//等待某个协程执行完毕后再执行后续代码
*yield return WWW();//等待WWW操作完成后再执行后续代码
*yield return new WaitForEndOfFrame();//等待帧结束,等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
*yield return new WaitForSeconds(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响);
*yield return new WaitForSecondsRealtime(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间不受到Time.timeScale的影响);
*yield return WaitForFixedUpdate();//等待下一次FixedUpdate开始时再执行后续代码
*yield return new WaitUntil()//将协同执行直到 当输入的参数(或者委托)为true的时候....如:yield return new WaitUntil(() => frame >= 10);
*yield return new WaitWhile()//将协同执行直到 当输入的参数(或者委托)为false的时候.... 如:yield return new WaitWhile(() => frame < 10);
*/
#endregion
}
协程的开启
开启协程需要使用StartCoroutine()方法:
开启无参数的协程:
StartCoroutine(协程名());或StartCoroutine("协程名");
开启单参数的协程:
StartCoroutine(协程名(参数));或StartCoroutine("协程名",参数);
开启多参数的协程:
StartCoroutine(协程名(参数1,......));
或
void StartCoroutine()//开启协程的函数
{
IEnumerator coroutine = Test(5, 6);
StartCoroutine(coroutine);
}
public IEnumerator Test(int a, int b)//协程
{
//等待帧画面渲染结束
yield return new WaitForEndOfFrame();
a=2;
b=3;
}
用“协程名”启动的方式不允许传入 一个以上的参数
协程的结束
结束协程有两种情况:
当协程的方法体执行完毕将会自动结束
调用StopCoroutine();方法中止协程执行
中止协程的几种情况:
中止所有协程:StopAllCoroutines();
使用对象实例中止指定协程
void Start()
{
c = StartCoroutine(CountSeconds());
}
void Update()
{
if (Input.GetKeyDown(KeyCode.J))
{
StopCoroutine(c);
}
}
使用字符串中止指定协程
StartCoroutine("协程名");
StopCoroutine("协程名");
只有以协程名字符串启动的协程可以用此方法中止
既:StartCoroutine(“协程名”);或StartCoroutine(“协程名”,参数);
允许使用**StopCoroutine(“协程名”);**中止协程
不允许使用直接调用协程方法的方式中止指定协程
既:**StopCoroutine(协程名([参数]));**不被允许
yield 协程回复条件语句
生命周期图