【Unity】Unity 中的协程 Coroutine 和 Invke 的区别

一:什么是 Invoke

Invoke 方法是 Unity 的一种委托机制。

比如 Invoke(“SendMsg”, 5),它的意思是:5 秒之后调用 SendMsg() 方法;

再比如下面这段代码
InvokeRepeating(
这段代码的意思是:2 秒后调用 SendMsg 方法,并且之后每隔 3 秒调用一次 SendMsg 方法。

比如模拟英雄联盟的出兵,就可以用 Invoke 这个方法,到 1分10秒 开始调用此方法,然后每隔 30秒 调用一次生成小兵的方法。

1-1 使用 Invoke 的注意事项 :

  • 它应该在脚本的生命周期里的(Start、Update、OnGUI、FixedUpdate、LateUpdate)中被调用;
  • Invoke 不能接受含有参数的方法;
  • 在 Time.ScaleTime = 0 时, Invoke 无效,因为它不会被调用到,另外,Invoke 也支持重复调用;

二、什么是 Unity 中的协程 Coroutine

这里推荐两篇关于 Unity 协程不错的文章
Unity 协程原理深入剖析 ,Unity 协程介绍以及使用

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

2-2 协程的作用

  • 延时(等待)一段时间执行代码;
  • 等某个操作完成之后再执行后面的代码,总结起来就是一句话:控制代码在特定的时机执行。

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

2-3 使用协程的注意事项

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

三:协程 Coroutine 和 Invke 的区别

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

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


结束语

如果这篇博客有幸帮到了您,欢迎点击下方链接,和更多志同道合的伙伴一起交流,一起进步。

Web开发者俱乐部

你可能感兴趣的:(Unity)