Unity3d_协程和Invoke

目前的项目中经常用到计时器,一些延迟执行操作。

开始总是使用最基础的time += Time。deltatime;再用time来判断时间。但是若是一个脚本需要拥有多个计时器,这会使脚本变得很乱。

于是在网上开始查询相关资料。

发现2个两个比较便捷的操作:

1.Invoke

2.协程


一、Invoke函数。

原文:http://blog.csdn.net/ycguhang/article/details/18808873


1.Invoke是一种委托方法。

void Invoke(string methodName, float time);,第一个参数是要调用的函数名,后一个参数是延迟的时间。

意思为:在time时间后调用函数名为methodName方法。


2.使用 Invoke() 方法需要注意 3点:
(1 ):它应该在 脚本的生命周期里的(Start、Update、OnGUI、FixedUpdate、LateUpdate)中被调用;
(2):Invoke(); 不能接受含有 参数的方法;
(3):在 Time.ScaleTime = 0; 时, Invoke() 无效,因为它不会被调用到

3.Invoke() 也支持重复调用:void InvokeRepeating(string methodName, float time, float repeatRate);

意思是指:time秒后调用 调用函数名为methodName方法,并且之后每隔 repeatRate秒调用一次调用函数名为methodName方法


二、协程

(Unity协程(Coroutine)原理深入剖析)原文:http://dsqiu.iteye.com/blog/2029701

(Unity3D协程介绍以及使用)转载:http://blog.csdn.net/huang9012/article/details/38492937

此文章是翻译作品,不过讲的很详细,很科普。

(unity3D中使用协程来做“多次调用一次更新”特性的一个大坑)原文:http://blog.csdn.net/kun1234567/article/details/7720246


1.使用协程的作用一共有两点:1)延时(等待)一段时间执行代码;2)等某个操作完成之后再执行后面的代码。总结起来就是一句话:控制代码在特定的时机执行。

协程不是线程,也不是异步执行的。协程和 MonoBehaviour 的 Update函数一样也是在MainThread中执行的。使用协程你不用考虑同步和锁的问题。


2.协程的定义:协程是一个分部执行,遇到条件(yield return 语句)会挂起,直到条件满足才会被唤醒继续执行后面的代码。 Unity在每一帧(Frame)都会去处理对象上的协程。Unity主要是在Update后去处理协程(检查协程的条件是否满足)


3.注意事项:

(1)在程序中调用StopCoroutine()方法只能终止以字符串形式启动(开始)的协程;
(2)多个协程可以同时运行,它们会根据各自的启动顺序来更新;
(3)协程可以嵌套任意多层;
(4)如果你想让多个脚本访问一个协程,那么你可以定义静态的协程;
(5)协程不是多线程(尽管它们看上去是这样的),它们运行在同一线程中,跟普通的脚本一样;
(6)如果你的程序需要进行大量的计算,那么可以考虑在一个随时间进行的协程中处理它们;
(7)IEnumerator类型的方法不能带ref或者out型的参数,但可以带被传递的引用;
(8)目前在Unity中没有简便的方法来检测作用于对象的协程数量以及具体是哪些协程作用在对象上。

(9)MonoBehaviour.enabled = false 协程会照常运行,但 gameObject.SetActive(false) 后协程却全部停止,即使在Inspector把  gameObject 激活还是没有继续执行


4.补充:

(1)在协程第三篇博客里面有写:使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以开启一个线程。区别在于使用字符串作为参数可以开启线程并在线程结束前终止线程,相反使用IEnumerator 作为参数只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);另外使用字符串作为参数时,开启线程时最多只能传递一个参数,并且性能消耗会更大一点,而使用IEnumerator 作为参数则没有这个限制。

(2)以字符串形式启动的协程也是可以带参数的,不过只能带一个,如果要传多个参数,可以以数组的形式。如果要传多个多个类型不同的参数,可以使用结构体传参。

(3)如果关闭使用字符串作为参数的协程,会将同名的协程一并关闭。

(4)协程的重复开启,相当于另开了一个update,按照开启顺序执行,互相不影响,但是若是涉及到全局变量,相当于多个协程根据对应创建顺序处理该变量。


三、协程Coroutine与Invoke比较

(Unity学习笔记——MonoBehaviour类Invoke, Coroutine)原文:http://blog.csdn.net/lidongdong_xynu/article/details/7445579

(【UNITY3D 游戏开发之六】Unity 协程Coroutine与Invoke)原文:http://www.himigame.com/unity3d-game/1610.html


以上有两篇文章有进行Invoke与协程进行比较:

1.himi:

相对于协程来说,

(1)Invoke函数必须输入方法名,对于上下文变量、属性的引用就会尤为不便

(2)不能传参数


2.lidongdong_xynu:

Invoke方法:执行没有被挂起,相当于设置完被调用函数的执行时间后即时向下执行。应用到每隔一段时间执行某个函数很方便。

Coroutine方法:新开一条执行序列(跟新建线程差不多)并挂起,等待中断指令结束。开销不大。当需要挂起当前执行时使用。


差不多暂时学到这边,如果有新的认识还会继续补充。


你可能感兴趣的:(unity3d)