Unity3d协程和Invoke的理解

Unity3d协程和Invoke的理解

当前项目中经常使用定时器,有些延迟执行操作。

总是从最基本的时间 += 时间开始。增量时间;然后用时间来判断时间。但是如果一个脚本需要有多个计时器,这会使脚本非常混乱。

于是我开始在网上寻找相关资料。

发现2个更方便的操作:

1.调用

2.协程

一、调用函数。

原来的:

1.Invoke 是一个委托方法。

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

意思是:在一段时间后调用名为methodName方法的函数。

2.使用Invoke()方法注意3点:

(1):应该在脚本的生命周期中调用(Start、Update、OnGUI、FixedUpdate、LateUpdate);

(2): Invoke(); 不能接受带参数的方法;

(3): Invoke() 在 Time.ScaleTime = 0 时无效;因为它不会被调用到

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

这意味着名为 methodName 的方法在 time 秒之后被调用,并且名为 methodName 的方法在此后每隔 repeatRate 秒被调用。

二、协程

(Unity协程原理深入解析)原文:

(Unity3D协程介绍及使用)转载:

这篇文章是翻译作品3D道具,但是写的很详细unity协程原理,很受欢迎。

(Unity3D用协程做了一个“多次调用更新”功能的大坑)原文:

1.使用协程有两个作用:1)延迟(等待)执行代码一段时间;2)在执行以下代码之前等待操作完成。一句话概括:控制代码在特定时间的执行。

协程不是线程,不会异步执行。协程和 MonoBehaviour 的 Update 函数也在 MainThread 中执行。使用协程,您不必担心同步和锁。

2.协程的定义:协程是部分执行,当遇到条件(yield return 语句)时会挂起,直到条件满足才会被唤醒继续执行下面的代码。Unity 每帧处理对象上的协程。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(IEnumeratorroutine)都可以启动线程。不同的是,使用字符串作为参数可以启动线程,启动线程thread 在线程结束前终止线程,相反,使用 IEnumerator 作为参数只能等待线程结束,不能随时终止(除非使用了 StopAllCoroutines() 方法);另外,在使用一个字符串作为参数,启动线程时只能传一个参数,性能消耗会比较大,而且使用IEnumerator作为参数没有这个限制。

(2)以字符串形式启动的协程也可以带参数,但只能带一个。如果要传递多个参数,可以以数组的形式传递。如果要传递多个不同的参数types ,您可以使用结构来传递参数。

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

(4)一个协程的重复开启,相当于开启另一个更新,按照开启的顺序执行unity协程原理,互不影响,但如果涉及全局变量,则相当于多个协程处理变量根据相应的创建顺序。

三、Coroutine 和 Invoke 的比较

(Unity学习笔记-MonoBehaviour类Invoke、Coroutine)原文:

(【Unity3D游戏开发六】Unity协程Coroutine与Invoke)原文:

上面有两篇文章比较了Invoke和协程:

1.希米:

与协程相比,

(1)调用函数必须输入方法名,特别不方便上下文变量和属性的引用

(2)不能传参数

2.lidongdong_xynu:

调用方法:不暂停执行,相当于设置了被调用函数的执行时间后立​​即向下执行。用于定期执行功能很方便。

协程方法:开启一个新的执行序列(类似于一个新线程)并将其挂起,等待中断指令结束。开销不大。在需要暂停当前执行时使用。

这个我暂时学会了,如果有新的知识我会继续补充的。