博客
关于我
神马都是浮云,unity中自己写Coroutine协程源码
阅读量:264 次
发布时间:2019-03-01

本文共 2215 字,大约阅读时间需要 7 分钟。

最近在学习Unity协程调度器

最近在学习Unity协程调度器,发现了一篇非常有趣的文章。通过阅读相关资料,我对协程的运行机制有了更深入的理解。协程调度器是一个非常强大的工具,能够帮助开发者更好地管理和协调多个协程的执行。

协程调度器的基本功能

协程调度器允许开发者完全控制一套协同程序的执行机制。通过阅读代码,我了解到协程调度器如何在幕后工作。例如,协程可以通过yield;等待下一次更新,或者通过yield anInt;等待指定数量的更新。还可以通过yield aFloat;等待给定的秒数,或者通过yield scheduler.StartCoroutine(Coroutine());等待另一个协程完成。

一个简单的协同调度程序

我找到了一个简单的协同调度程序代码。这个代码允许开发者完全控制协同程序的执行机制。通过阅读代码,我了解到协同程序如何构建.Net发电机的基础上构建,并将协同支持添加到非Unity的项目中。

代码示例

using UnityEngine;using System.Collections;public class testAPI : MonoBehaviour{    CoroutineScheduler scheduler;    CoroutineScheduler m_scheduler2;    string requestURL = "http://www.my-server.com/cgi-bin/screenshot.pl";    void Start()    {        scheduler = new CoroutineScheduler();        scheduler.StartCoroutine(MyCoroutine());        m_scheduler2 = new CoroutineScheduler();        m_scheduler2.StartCoroutine(test());    }    IEnumerator MyCoroutine()    {        Debug.Log("MyCoroutine: Begin");        yield return 0;        Debug.Log("MyCoroutine: next update;" + Time.time);        yield return 2;        Debug.Log("MyCoroutine: After yield 2;" + Time.time);        yield return 3.5f;        Debug.Log("MyCoroutine: After 3.5 seconds;" + Time.time);        yield return scheduler.StartCoroutine(WaitForMe());        Debug.Log("MyCoroutine: After WaitForMe() finished;" + Time.time);    }    IEnumerator WaitForMe()    {        yield return 7.8f;    }    void Update()    {        scheduler.UpdateAllCoroutines(Time.frameCount, Time.time);    }    IEnumerator test()    {        // ...设置请求        var www = new UnityEngine.WWW(requestURL);        yield return new UnityWWWYieldWrapper(www);        // ...加载完成后执行操作    }}

项目地址

通过阅读代码,我了解到协同程序如何在不同的调度程序实例下运行。这个调度程序支持多个实例,并且可以在不同的时间点启动协程。这种设计使得协程能够在不同的调度程序实例下运行,非常有用。

协同程序的运行机制

在Unity中,协同程序的运行机制与自定义调度程序略有不同。例如,Unity会在协同程序的第一次yield时立即运行,而自定义调度程序会在下一次UpdateAllCoroutines调用时才运行。这种设计允许开发者在任何时候启动协程,并确保协程只能在特定的时间运行。

注意事项

在使用同一个更新调度程序运行多个协程时,不能依赖更新的顺序。例如,StartCoroutine(A)StartCoroutine(B)StartCoroutine(C),其中A、B、C都在循环中不断调用print(A|B|C); yield;,不要假设输出顺序会是ABC或CBA等。

总结

通过学习和实践,我对Unity协程调度器有了更深入的理解。协程调度器是一个非常强大的工具,能够帮助开发者更好地管理和协调多个协程的执行。通过阅读代码和实际使用,我学会了如何在非Unity项目中集成协同支持。

通过这次学习,我对协程调度器的实现和使用有了更全面的认识。未来,我希望能够进一步探索协程调度器的更多功能,并在实际项目中应用这些知识。

转载地址:http://reoa.baihongyu.com/

你可能感兴趣的文章