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);
    }
}

结果:

相关推荐
Xudde.1 小时前
班级作业笔记报告0x04
笔记·学习·安全·web安全·php
晓晓hh1 小时前
JavaSE学习——迭代器
java·开发语言·学习
Laurence1 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
kyriewen112 小时前
你点的“刷新”是假刷新?前端路由的瞒天过海术
开发语言·前端·javascript·ecmascript·html5
014-code2 小时前
String.intern() 到底干了什么
java·开发语言·面试
421!2 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
摇滚侠2 小时前
JAVA 项目教程《苍穹外卖-12》,微信小程序项目,前后端分离,从开发到部署
java·开发语言·vue.js·node.js
AI成长日志3 小时前
【笔面试算法学习专栏】双指针专题·简单难度两题精讲:167.两数之和II、283.移动零
学习·算法·面试
@insist1233 小时前
网络工程师-生成树协议(STP/RSTP/MSTP)核心原理与应用
服务器·开发语言·网络工程师·软考·软件水平考试
野生技术架构师3 小时前
2026年牛客网最新Java面试题总结
java·开发语言