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

结果:

相关推荐
Z1Jxxx8 分钟前
日期日期日期
开发语言·c++·算法
Learner9 分钟前
Python函数
开发语言·python
_李小白15 分钟前
【Android FrameWork】延伸阅读:AMS 的 handleApplicationCrash
android·开发语言·python
Gary Studio16 分钟前
simulink simscape(机器人方向)学习笔记
笔记·学习
蕨蕨学AI19 分钟前
【Wolfram语言】45.1 数据集
开发语言·wolfram
黎雁·泠崖20 分钟前
Java入门篇之吃透基础语法(一):注释+关键字+字面量全解析
java·开发语言·intellij-idea·intellij idea
hqwest21 分钟前
码上通QT实战15--监控页面07-打开串口连接
开发语言·qt·多线程·signal·slot·emit·信号和槽
mjhcsp22 分钟前
C++ 后缀树(Suffix Tree):原理、实现与应用全解析
java·开发语言·c++·suffix-tree·后缀树
mjhcsp30 分钟前
C++ 有限状态自动机(FSM):原理、实现与应用全解析
开发语言·c++·有限状态自动机