Unity3D协程闭包事件执行定时器

介于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
EventTimer e = new EventTimer();
StartCoroutine(e.Timer(5.0f,test()));

点击运行,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

本文链接:Unity3D协程闭包事件执行定时器

转载声明:BeiTown原创,转载请注明来源:BeiTown's Coder 编码之源,谢谢


Tags: , , , , , , ,

3 Responses to Unity3D协程闭包事件执行定时器

  1. 江南 说道:

    有问题啊,EventTimer 脚本报语法错误

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>