这是【Unity3D 教程系列第 7 篇】,如果觉得有用的话,欢迎关注专栏。
一:什么是 InvokeInvoke 方法是 Unity 的一种委托机制。
比如 Invoke(“SendMsg”, 5),它的意思是:5 秒之后调用 SendMsg() 方法;
再比如下面这段代码 这段代码的意思是:2 秒后调用 SendMsg 方法,并且之后每隔 3 秒调用一次 SendMsg 方法。
比如模拟英雄联盟的出兵,就可以用 Invoke 这个方法,到 1分10秒 开始调用此方法,然后每隔 30秒 调用一次生成小兵的方法。
1-1 使用 Invoke 的注意事项 :
- 它应该在脚本的生命周期里的(Start、Update、OnGUI、FixedUpdate、LateUpdate)中被调用;
- Invoke 不能接受含有参数的方法;
- 在 Time.ScaleTime = 0 时, Invoke 无效,因为它不会被调用到,另外,Invoke 也支持重复调用;
这里推荐两篇关于 Unity 协程不错的文章 Unity 协程原理深入剖析 ,Unity 协程介绍以及使用
2-1 协程的定义 协程是一个分步执行,遇到条件(yield return 语句)会挂起,直到条件满足才会被唤醒继续执行后面的代码。 Unity 在每一帧都会去处理对象上的协程。Unity 主要是在 Update 后去处理协程(检查协程的条件是否满足)。
2-2 协程的作用
- 延时(等待)一段时间执行代码;
- 等某个操作完成之后再执行后面的代码,总结起来就是一句话:控制代码在特定的时机执行。
注意:协程不是线程,也不是异步执行的。协程和 MonoBehaviour 的 Update 函数一样也是在 MainThread 中执行的。使用协程你不用考虑同步和锁的问题。
2-3 使用协程的注意事项
- 在程序中调用 StopCoroutine() 方法只能终止以字符串形式启动(开始)的协程;
- 多个协程可以同时运行,它们会根据各自的启动顺序来更新;
- 协程可以嵌套任意多层;
- 如果你想让多个脚本访问一个协程,你可以定义静态的协程;
- 协程不是多线程(尽管它们看上去是这样的),它们运行在同一线程中,跟普通的脚本一样;
- 如果你的程序需要进行大量的计算,那么可以考虑在一个随时间进行的协程中处理它们;
- IEnumerator 类型的方法不能带 ref 或者 out 型的参数,但可以带被传递的引用;
- 目前在 Unity 中没有简便的方法来检测作用于对象的协程数量,以及具体是哪些协程作用在对象上。
- MonoBehaviour.enabled = false 协程会照常运行,但 gameObject.SetActive(false) 后协程会全部停止,即使在 Inspector 面板 把 gameObject 激活也不会继续执行。
Invoke:执行没有被挂起,相当于设置完被调用函数的执行时间后,即时向下执行,适用于每隔一段时间执行某个函数。
Coroutine:新开一条执行序列(跟新建线程差不多)并挂起,等待中断指令结束,开销不大,当需要挂起当前执行时使用。
你的问题得到解决了吗?欢迎在评论区留言。
赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。
结束语 技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。 最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。