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

本文共 2256 字,大约阅读时间需要 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/

你可能感兴趣的文章
Objective-C实现图像相似度平均值哈希算法(附完整源码)
查看>>
Objective-C实现图像相似度平均值哈希算法(附完整源码)
查看>>
Objective-C实现图像移动(附完整源码)
查看>>
Objective-C实现图层混合算法(附完整源码)
查看>>
Objective-C实现图层混合算法(附完整源码)
查看>>
Objective-C实现图形着色算法(附完整源码)
查看>>
Objective-C实现图片dilation operation扩张操作算法(附完整源码)
查看>>
Objective-C实现图片erosion operation侵蚀操作算法(附完整源码)
查看>>
Objective-C实现图片格式转换(附完整源码)
查看>>
Objective-C实现图片的放大缩小(附完整源码)
查看>>
Objective-C实现图片腐蚀(附完整源码)
查看>>
Objective-C实现图片膨胀(附完整源码)
查看>>
Objective-C实现图片转化为 ASCII图(附完整源码)
查看>>
Objective-C实现图的拓扑序列(附完整源码)
查看>>
Objective-C实现图的邻接矩阵(附完整源码)
查看>>
Objective-C实现图结构(附完整源码)
查看>>
Objective-C实现圆球的表面积和体积(附完整源码)
查看>>
Objective-C实现在list中找到next greatest element下一个更大元素算法(附完整源码)
查看>>
Objective-C实现在Regex的帮助下检查字谜算法(附完整源码)
查看>>
Objective-C实现在指定区间 [a, b] 中找到函数的实根,其中 f(a)*f(b) < 0算法(附完整源码)
查看>>