unity3d————协程原理讲解

1.协程的本质

协程可以分成两部分

1.协程函数本体
2.协程调度器

协程本体就是一个能够中间暂停返回的函数

协程调度器是Unity内部实现的,会在对应的时机帮助我们继续执行协程函数

Unity只实现了协程调度部分

协程的本体本质上就是一个 C#的迭代器方法

2.协程本体是迭代器方法的体现

1.协程函数本体

如果我们不通过 开启协程方法执行协程
Unity的协程调度器是不会帮助我们管理协程函数的

2.协程调度器

继承MonoBehavior后 开启协程
相当于是把一个协程函数(迭代器)放入Unity的协程调度器中帮助我们管理进行执行
具体的yield return 后面的规则 也是Unity定义的一些规则

总结

你可以简化理解迭代器函数
C#看到迭代器函数和yield return 语法糖
就会把原本是一个的 函数 变成"几部分"
我们可以通过迭代器 从上到下遍历这 "几部分"进行执行
就达到了将一个函数中的逻辑分时执行的目的

而协程调度器就是 利用迭代器函数返回的内容来进行之后的处理

比如Unity中的协程调度器
根据yield return 返回的内容 决定了下一次在何时继续执行迭代器函数中的"下一部分"

理论上来说 我们可以利用迭代器函数的特点 自己实现协程调度器来取代Unity自带的调度器

3.总结

协程的本质 就是利用

C#的迭代器函数"分步执行"的特点
加上
协程调度逻辑
实现的一套分时执行函数的规则

4.代码示例

cs 复制代码
public class TestClass
{
    public int time;
    public TestClass(int time)
    {
        this.time = time;
    }
}

public class xiechengyuanli : MonoBehaviour
{
    IEnumerator Test()
    {
        print("第一次执行");
        yield return 1;
        print("第二次执行");
        yield return 2;
        print("第三次执行");
        yield return "123";
        print("第四次执行");
        yield return new TestClass(10);
    }
    void Start()
    {
        IEnumerator e = Test();
        while(e.MoveNext())
        {
            print(e.Current);
        }

        TestClass test = e.Current as TestClass;
        print("time = " + test.time);
    }
}

结果:

相关推荐
韩曙亮4 分钟前
【人工智能】AI 人工智能 技术 学习路径分析 ① ( Python语言 -> 微积分 / 概率论 / 线性代数 -> 机器学习 )
人工智能·python·学习·数学·机器学习·ai·微积分
Yue丶越9 分钟前
【C语言】自定义类型:结构体
c语言·开发语言
辞旧 lekkk10 分钟前
【c++】封装红黑树实现mymap和myset
c++·学习·算法·萌新
合作小小程序员小小店10 分钟前
桌面开发,点餐管理系统开发,基于C#,winform,sql server数据库
开发语言·数据库·sql·microsoft·c#
笃行客从不躺平14 分钟前
线程池监控是什么
java·开发语言
星轨初途16 分钟前
C++的输入输出(上)(算法竞赛类)
开发语言·c++·经验分享·笔记·算法
dangdang___go1 小时前
动态内存管理||malloc和free.realloc和calloc
c语言·开发语言·算法·动态内存管理
YA3331 小时前
mcp-grafana mcp 使用stdio报错
java·开发语言
r***18641 小时前
如何使用C#与SQL Server数据库进行交互
数据库·c#·交互
周杰伦_Jay1 小时前
【Go 语言主流 Web】 框架详细解析
开发语言·后端·微服务·架构·golang