介于U3D没有一个自带的事件执行定时器,所以打算自己动手做一个,基本思路如下,先用伪代码来写了
1 2 3 4 5 6 | void timer(int time,Func func){ wait(time);//等待N秒 func();//执行传入的函数 } |
最开始的思路是用闭包加线程来实现,之后和群里的朋友讨论了下,经过提示其实可以避免去碰线程这种bug多发产物,取而代之的是U3D包里自带的一个协程MonoBehaviour.StartCoroutine
先来完善下我们的事件定时器,惯例直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | using UnityEngine; using System.Collections; using System; public class EventTimer : MonoBehaviour { public IEnumerator Timer(float waitTime , Func[bool> func) { yield return new WaitForSeconds(waitTime); func(); } } |
IEnumerator即是定义一个协程函数,yield的意义相当于语句中断,WaitForSeconds()是U3D自带的一个协程方法,官方解释是:在给定的秒数内,暂停协同程序的执行。
看上去非常简洁。
接下来我们看下如何来使用这个协程函数。
先看如何定义一个闭包的代码:
1 2 3 4 5 6 7 8 9 10 11 | Func[bool> test() { return () => { print("Func is working"); return true; }; } |
这里的=》是一个lambda表达式,即一个可用于创建委托或表达式树类型的匿名函数,在本例中的具体用法参照上面的代码的格式就行了。
接下来用这两行代码即可调用之前定义的协程函数传递test()方法:
1 2 |
点击运行,5秒后程序执行了test()函数:
当然也可以直接写入闭包:
1 2 3 4 5 6 | EventTimer e = new EventTimer(); StartCoroutine(e.Timer(5.0f,() => { print("Func is working"); return true; })); |
效果同上。
本例仅涉及到最简单的闭包与协程的用法,更多的高级用法有待大家自己发掘,再次谢谢群里的朋友,有交流才有进步。
谢谢关注。
BeiTown
2013.03.11
Tags: BeiTown, Func, StartCoroutine, U3D, Unity, 协程, 定时器, 闭包
有问题啊,EventTimer 脚本报语法错误
多谢,已经好了
Func[bool] 注意符号 我的博客代码工具有点问题 只能用’>'符号代替‘]’