Unity3d 协程和Invoke 的理解

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

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

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

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

1.Invoke

2.协程

 

一、Invoke函数。

原文:http://blog.youkuaiyun.com/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.youkuaiyun.com/huang9012/article/details/38492937

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

(unity3D中使用协程来做“多次调用一次更新”特性的一个大坑)原文:http://blog.youkuaiyun.com/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.youkuaiyun.com/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方法:新开一条执行序列(跟新建线程差不多)并挂起,等待中断指令结束。开销不大。当需要挂起当前执行时使用。

 

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

在Unity中,Invoke协程(Coroutine)都是用于延迟执行代码的方法,但它们有一些重要的区别不同的使用场景。 ### Invoke Invoke是一种在指定时间后调用某个方法的方式。它的使用非常简单,主要用于在固定的时间延迟后执行某个方法。 #### 用法 1. **定义一个方法**:首先,需要定义一个没有参数且返回类型为void的方法。 2. **调用Invoke**:使用Invoke方法并传入方法名延迟时间。 ```csharp using UnityEngine; public class InvokeExample : MonoBehaviour { void Start() { Invoke("DelayedMethod", 2f); // 2秒后调用DelayedMethod } void DelayedMethod() { Debug.Log("This method was called after 2 seconds."); } } ``` ### 协程(Coroutine) 协程是一种在特定时间间隔内逐步执行代码的方式。它允许在执行过程中暂停恢复,适合用于需要分步执行的复杂任务。 #### 用法 1. **定义一个协程方法**:协程方法需要返回类型为IEnumerator。 2. **启动协程**:使用StartCoroutine方法并传入协程方法名。 ```csharp using UnityEngine; using System.Collections; public class CoroutineExample : MonoBehaviour { void Start() { StartCoroutine(DelayedCoroutine()); } IEnumerator DelayedCoroutine() { Debug.Log("Coroutine started."); yield return new WaitForSeconds(2f); // 等待2秒 Debug.Log("This message is displayed after 2 seconds."); } } ``` ### 区别 1. **使用场景**: - Invoke适用于简单的延迟调用。 - 协程适用于需要在延迟期间执行复杂任务的场景。 2. **灵活性**: - Invoke只能延迟调用方法,不能在延迟期间执行其他操作。 - 协程可以在延迟期间执行多步操作,并可以在需要时提前终止。 3. **性能**: - Invoke在内部实现上相对简单,适用于轻量级任务。 - 协程在复杂任务中表现更好,但需要注意避免过度使用以免影响性能。 ### 总结 Invoke协程各有优缺点,选择使用哪一种方法取决于具体的需求场景。对于简单的延迟调用,Invoke更为方便;而对于需要分步执行的复杂任务,协程则更为合适。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值