Unity协程(Coroutine)

在进行主任务的过程中我们需要一个对资源消耗极大的操作时,如果在一帧中实现这一的操作,游戏就会变得十分卡顿,这个时候,我们就可以通过协程,在一定帧内完成该工作的处理,同时不影响主任务的进行。

实现原理

协程依旧是在主线程中进行,通过关键字IEnumerator来定义一个迭代方法,在迭代方法中使用yield关键字,可以使协程的运行暂停、记录下一次启动的时间与位置等。

在程序中通过StartCoroutine来开启一个协程,StopCoroutine来关闭一个协程。

注意不是IEnumerable,它是在IEnumerator基础上的一个封装接口,有一个GetEnumerator()方法返回IEnumerator

使用方法

StartCoroutine的重载:

StartCoroutine(string methodName):通过方法的名字来开启协程

StartCoroutine(string methodName,object values):带形参的情况下,通过方法的名字来开启协程

StartCoroutine(IEnumerator routine):通过指定的方法调用协程

StopCoroutine的重载:

StopCoroutine(string methodName):通过方法的名字来关闭协程

StopCoroutine(IEnumerator routine):通过指定的方法来关闭协程

StopCoroutine(Coroutine routine):通过指定的协程来关闭协程

yield在生命周期中位于UpdateLateUpdate之间,在迭代方法中有不少使用方式:

yield return null;暂停协程等待下一帧继续执行

yield return 数字;暂停协程等待下一帧继续执行

yield return new WaitForFixedUpdate();等到下一个固定帧数更新

yield return new WaitForSeconds(时间);等待规定时间后继续执行

yield return new WaitForEndOfFrame();等到所有相机画面渲染完毕后更新

yield return StartCoroutine("协程方法名");开启一个协程

yield break;跳出协程对应方法

实际应用

如果某一时刻需要使用Update读取一个列表,这样一般需要一个循环去遍历列表,这样每帧的代码执行量就比较大,就可以将这样的执行放置到协程中来处理:

public List<int> nums = new List<int> { 1, 2, 3, 4, 5, 6 };

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        StartCoroutine(PrintNum(nums));
    }
}
//通过协程分帧处理
IEnumerator PrintNum(List<int> nums)
{
    foreach (int i in nums)
    {
        Debug.Log(i);
        yield return null;
    }
    StopCoroutine(PrintNum(nums));
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值