实现一个自己的WaitForSeconds

协程的所能达到的效果就是在指定的时间点上执行需要执行的代码,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;}}}}

调用的方法与Unity差不多:

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则停止等待。

所有欺骗中,自欺是最为严重的

实现一个自己的WaitForSeconds

相关文章:

你感兴趣的文章:

标签云: