【Unity】Unity协程(Coroutine)的原理与应用

本文详细介绍了Unity协程的概念、应用场景及使用技巧。协程可用于异步加载资源、分帧执行复杂程序和实现定时器。在Unity中,协程是通过C#迭代器函数实现,其调度在MonoBehaviour生命周期中完成。理解协程的底层原理有助于更好地利用协程优化游戏性能。
摘要由CSDN通过智能技术生成


前言

本文是作者在学习Unity过程中对协程相关知识的汇总,以方便以后查阅。大部分内容转载自不同文章,原文链接可在最后一部分查看,如果对文章内容有任何困惑或者疑问,建议阅读原文相关部分。


一、什么是协程

首先看一下Unity官方对协程的定义:

A coroutine is like a function that has the ability to pause execution and return control to Unity but then to continue where it left off on the following frame.

Unity中的协程是一种返回值为IEnumerator的特殊函数,它可以主动的请求暂停自身并提交一个唤醒条件,Unity会在唤醒条件满足的时候去重新唤醒协程,所以协程还是运行在主线程上。

二、应用场景

1.异步加载资源

资源加载指的是通过IO操作,将磁盘或服务器上的数据加载成内存中的对象。资源加载一般是一个比较耗时的操作,如果直接放在主线程中会导致游戏卡顿,通常会放到异步线程中去执行。

举个例子,当你需要从服务器上加载一个图片并显示给用户,你需要做两件事情:

  1. 通过IO操作从服务器上加载图片数据到内存中。
  2. 当加载完成后,将图片显示在屏幕上。

其中,2操作必须等待1操作执行完毕后才能开始执行。

//伪代码
​
IEnumerator ShowImageFromUrl(string url)
{
   
    Image image = null;
    yield return LoadImageAsync(url, image); //异步加载图像,加载完成后唤醒协程
    Show(image);
}

使用协程来进行异步加载在Unity中是一个很常用的写法。异步资源加载是一个较为深奥的话题,有兴趣的话可以通过下面两个参考链接进行研究:
Unity官方的异步加载场景的示例
倩女幽魂手游中的资源加载与更新方案

2.将一个复杂程序分帧执行

如果一个复杂的函数对于一帧的性能需求很大,我们就可以通过yield return null将步骤拆除,从而将性能压力分摊开来,最终获取一个流畅的过程,这就是一个简单的应用。

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

public class Test : MonoBehaviour
{
   
    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;
                 
        }

    }
}

3.定时器

当你需要延时执行一个方法或者是每隔一段时间就执行某项操作时,可以使用协程。当然这种应用场景很少,如果我们需要计时器有很多其他

  • 12
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值