【Unity】理解协程的原理1——实现一个自己的WaitForSeconds
来源:互联网 发布:兄弟连it教育怎么样 编辑:程序博客网 时间:2024/05/22 17:22
协程的所能达到的效果就是在指定的时间点上执行需要执行的代码,Unity中开始一个协程的函数是StartCoroutine,而提供的延迟的类有以下几种分别是
new WaitForEndOfFrame; //等待一帧 new WaitForFixedUpdate; //等待一个FixedUpdate(固定时间间隔) new WaitForSeconds; //等待X秒 new WWW; //等待外部资源加载完毕
本文就针对其中的WaitForSeconds实现进行探究。 因为在开发过程中,很多时候会遇到一种情况就是,超时或者是符合某种条件就继续运行,使用系统提供WaitForSeconds已经无法满足要求了,这时候有两种解决方法,一种是使用StopCoroutine来停止协程,但是对于Unity来说,这种行为会造成很大的开销,那么可以采用重写WaitForSeconds,使它能达到我们的要求。以下是我认为的WaitForSeconds的实现:
/// <summary> /// 任务扩展 /// </summary> static class CTaskExtend { static public IEnumerator WaitForSeconds(float second) { DateTime init_dt = DateTime.Now; TimeSpan time; while(true) { time = DateTime.Now - init_dt; if(time.TotalSeconds <= second) { yield return null; } else { break; } } } }
yield return CTaskExtend.WaitForSeconds(delayTime);
看上去似乎非常简单,确实也是非常简单,那么如果遇到之前说的那一种情况(超时或者是符合某种条件就继续运行),这里需要做怎么样的改动呢?如下:
/// <summary> /// 任务扩展 /// </summary> static class CTaskExtend { public delegate bool CondDelegate(); static public IEnumerator WaitForSeconds(float second, CondDelegate cond = null) { DateTime init_dt = DateTime.Now; TimeSpan time; while(true) { time = DateTime.Now - init_dt; if (time.TotalSeconds <= second && !cond()) { yield return null; } else { break; } } } }
加上了一个回调函数,每次都会检查这个函数是否为true,如果为true则停止等待。
0 0
- 【Unity】理解协程的原理1——实现一个自己的WaitForSeconds
- 实现一个Unity3d的WaitForSeconds
- 关于unity中C#使用WaitForSeconds的方法
- unity实现自己的一个消息系统
- unity waitforseconds
- unity中invoke*和waitforseconds在停止携程后的表现不同
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
- 深入理解PHP原理之实现自己的PHP语法
- 理解vue实现原理,实现一个简单的Vue框架
- 理解vue实现原理,实现一个简单的Vue框架
- 对session的原理解释以及自己实现一个session
- 理解requireJS原理,实现一个简单的模块加载器
- 初学Linux
- Hibernate组件映射配置
- QQ空间自动评论自动转发 微博自动自动转发神器带源码(超简单) 升级版
- Event Loop
- POJ 3264 Balanced Lineup(线段树水题)
- 【Unity】理解协程的原理1——实现一个自己的WaitForSeconds
- Android——数据存储之SQLite数据库
- C#生成缩略图不失真的方法
- [历年IT面试题]百度2014研发类校园招聘笔试题解答
- github上搭建静态博客
- 如何设置eclipse下查看java源码
- struts2 拦截器
- 欢迎使用CSDN-markdown编辑器
- 笔面试中被问到n次的问题——抽象类和接口