来自SIKI学院的课程:http://www.sikiedu.com/my/course/370
老师的知乎:https://zhuanlan.zhihu.com/p/55420579
以下内容作为学习记录,方便查看.
学习Unity物体及脚本的生命周期流程
- Awake:游戏物体实例化后并处于激活状态时调用,即使脚本组件没有激活也会调用,而且总是在Start()函数之前调用
- OnEnable:游戏物体与脚本组件激活时调用(会反复触发)
- Start:游戏物体与脚本组件处于激活状态,在Update()运行前调用(只调用一次,当物体关闭激活状态,再打开时不会反复触发)
- FixedUpdate:根据设定的帧率运行(帧率固定,主要用于刚体运算,存在平衡机制去约束)
- Update:每帧调用一次(帧率不固定,与硬件性能以及逻辑复杂度相关)
- LateUpdate:每帧调用一次,在Update()之后调用
- OnDisable:游戏物体/脚本组件关闭激活时调用(会反复触发)
- OnDestroy:当游戏物体销毁时调用
- 注意:在一个场景加载以后,场景当中的每个物体都会遵循上述原则去运行物体上挂载脚本的函数
为什么要有协程?
- Uniy核心逻辑是单线程,为了开发便利,统一生命周期管理,不需要考虑锁的问题。
- 一些导步操作非常耗时,比如资源加载,如果让用户去使用多线程开发,整个开发逻辑会非常复杂。而通过协程封装起来,方便用户使用。并且对于一些耗废时间的操作,Unity会在引擎底层通过多线程去完成,而协程则通过不断的访问这个操作的状态判断加载是否完成。
启动协程的方法:
- StartCoroutine(IEnumerator routine)
- StartCoroutine(string routine)或StartCoroutine(string routine,object value) 通过传入函数名字的字符串启动协程的性能开销要更高,但这种方式启动的协程可以通过StopCoroutine(string methondname)来终止,这种方式还有一个限制就是只能传递一个参数。
协程终止的方法
- StopCoroutine(string methondname)只能终止通过字符串名字启动的协程
- StopCoroutine(Coroutine coroutine)
- StopAllCoroutines()终止所有协程
- 在协程内部终止可以使用
yeild break;
- 还有一种方法是直接把物体的active属性设置为false,这里是一个大坑,容易引发bug (Plane备注:以上都是针对当前这个MonoBehaviour中的协同程序而言)
协程的一些特性
- 在一个协程中可以启动另一个协程
- 一个协程可以暂停另一个协程
- 两个协程也可以同时并行工作
- 协程在执行过程中可以通过yield在任何时间点暂停,yeild返回的值决定了协程何时恢复执行
- 在多个游戏帧循环中进行操作时,协程表现十分出色,几乎没有额外性能开销
- StartCoroutine()函数总是会立即返回,不管你yeild返回的值是什么
- 多个协程结束时的顺序是无法保证与其启动顺序一致的,即使他们是在同一帧当中结束
关于yeild返回的值
- 可以是null,数字 ,字符串,布尔值甚至表达式,函数,嵌套协程。
- 当return是一个函数调用,赋值表达式,嵌套协程时,会直接调用这个函数或表达式。
- 协程一般情况下是在Update调用完成之后运行,在yeild后面的条件满足之前,协程会一直挂起在那里。
- 不同的yeild返回类型对应了不同的条件:
- null,数字,字符串:会在下一帧所有Update()函数运行之后继续运行
- WaitForSeconds:延迟指定的时间之后,在所有的Update()函数运行之后继续运行
- WaitForFixedUpdate:在所有FixedUpdate() 函数运行之后继续运行。(注意这里不是指下一帧,因为FixedUpdate()的帧率和Update()是不一样的)
- WWWW:当WWW资源加载成功以后继续运行。(其它的异步资源加载函数也是一样)
- StartCoroutine:运行完成嵌套的协程以后再继续运行。
暂无关于此日志的评论。