您当前的位置: 首页 >  unity

Allen Su

暂无认证

  • 4浏览

    0关注

    431博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Unity3D 教程系列第 7 篇】Unity 中的协程 Coroutine 和 Invke 的区别

Allen Su 发布时间:2018-11-10 11:44:23 ,浏览量:4

这是【Unity3D 教程系列第 7 篇】,如果觉得有用的话,欢迎关注专栏。

一:什么是 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:新开一条执行序列(跟新建线程差不多)并挂起,等待中断指令结束,开销不大,当需要挂起当前执行时使用。

你的问题得到解决了吗?欢迎在评论区留言。

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。

结束语 技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。 最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。
关注
打赏
1656491068
查看更多评论
立即登录/注册

微信扫码登录

0.0378s