unity多个物体间的脚本执行顺序
2017-02-21 21:00
411 查看
之前一篇文章中提到了脚本函数的执行顺序,具体参考这篇文章:Unity中Awake与Start函数的区别。这次我们来讨论当很多脚本执行的时候,这些函数的执行顺序和特点,首先我们知道unity官方的一张图:
即单个脚本中函数执行顺序为:
唤醒(Awake)
激活(OnEnable)
开始(Start)
固定刷新(FixedUpdate)
模拟物理(Physics)
触发器的进入,离开等(Trigger)
碰撞器的进入,离开等(Collision)
刚体的Transform的位置和旋转的处理(Rigibody)
鼠标按下,抬起等事件(OnMouse)
刷新(Update)
骨骼动画的融合处理等(Animation Blend)
最后刷新(LateUpdate)
渲染(Rendering)
接下来我们做个测试:
1 :我们建立一个脚本来记录重要函数的执行过程,如下:
2 :我们建立3个空的GameObject,分别命名为1,2,3,然后顺序拖放TestScriptsSequence脚本到这3个物体上,控制台输出:
请记住这个顺序和结尾结果进行比对。
3:接着我们开始运行几秒然后停止,观察控制台输出的顺序:
总结:运行结果可以看出几点:
每个物体的脚本的执行顺序与【第2步】挂载的顺序相反,即后挂载的脚本先执行,先挂载的脚本后执行。
大多数函数都是一定的规律执行:按照物体3执行完执行物体2的,物体2执行完执行物体1的顺序,比如Start, FixedUpdate,Update函数,并且只有当3个物体的FixedUpdate函数全部执行完了,才会去执行下一个Update函数,不会出现多线程的异步执行。
和其他函数不同的是,Awake和Enable函数成对出现,都是先执行完物体3的Awake和Enable才会去执行物体2的Awake和Enable函数,是按照物体3--->物体2--->物体1的顺序依次执行完。OnDisable和OnDestroy也具备这样的特点,但是不具备物体间的类似于3,2,1这种规律顺序执行。(控制台显示的是2,3,1的顺序)。
从结果可以看出,多个物体之间的脚本执行顺序并不是多线程的方式,而是按照上述的规律来执行的,我们这里暂且叫做Unity的“伪多线程”吧,意思大概就是遍历所有物体的脚本,依次执行某个阶段的函数,当这个阶段的函数全部执行完毕之后,才会开始去执行下个阶段的函数。
附工程下载地址:
测试工程例子下载 大家可以自己测试一下。
即单个脚本中函数执行顺序为:
唤醒(Awake)
激活(OnEnable)
开始(Start)
固定刷新(FixedUpdate)
模拟物理(Physics)
触发器的进入,离开等(Trigger)
碰撞器的进入,离开等(Collision)
刚体的Transform的位置和旋转的处理(Rigibody)
鼠标按下,抬起等事件(OnMouse)
刷新(Update)
骨骼动画的融合处理等(Animation Blend)
最后刷新(LateUpdate)
渲染(Rendering)
接下来我们做个测试:
1 :我们建立一个脚本来记录重要函数的执行过程,如下:
using UnityEngine; using System.Collections; public class TestScriptsSequence : MonoBehaviour { void Reset() { Debug.Log("Reset() ---" + this.name); } void Awake() { Debug.Log("Awake() ---" + this.name); } //启用脚本 void OnEnable() { Debug.Log("OnEnable() ---" + this.name); StartCoroutine("TestConrution"); } void Start() { Debug.Log("Start() ---" + this.name); }//Start_end IEnumerator TestConrution() { yield return new WaitForSeconds(0.5F); while (true) { yield return new WaitForSeconds(0.1F); Debug.Log("TestConrution 执行协程---" + this.name); } } void OnGUI() { Debug.Log("OnGUI() ---" + this.name); } void FixedUpdate() { Debug.Log("FixedUpdate() ---" + this.name); } void Update() { Debug.Log("Update() ---" + this.name); }//Update_end void LateUpdate() { Debug.Log("LateUpdate() ---" + this.name); } //脚本禁用(调用) void OnDisable() { Debug.Log("OnDisable() ---" + this.name); StopCoroutine("TestConrution"); } void OnDestroy() { Debug.Log("OnDestroy() ---" + this.name); } }//Class_end
2 :我们建立3个空的GameObject,分别命名为1,2,3,然后顺序拖放TestScriptsSequence脚本到这3个物体上,控制台输出:
请记住这个顺序和结尾结果进行比对。
3:接着我们开始运行几秒然后停止,观察控制台输出的顺序:
总结:运行结果可以看出几点:
每个物体的脚本的执行顺序与【第2步】挂载的顺序相反,即后挂载的脚本先执行,先挂载的脚本后执行。
大多数函数都是一定的规律执行:按照物体3执行完执行物体2的,物体2执行完执行物体1的顺序,比如Start, FixedUpdate,Update函数,并且只有当3个物体的FixedUpdate函数全部执行完了,才会去执行下一个Update函数,不会出现多线程的异步执行。
和其他函数不同的是,Awake和Enable函数成对出现,都是先执行完物体3的Awake和Enable才会去执行物体2的Awake和Enable函数,是按照物体3--->物体2--->物体1的顺序依次执行完。OnDisable和OnDestroy也具备这样的特点,但是不具备物体间的类似于3,2,1这种规律顺序执行。(控制台显示的是2,3,1的顺序)。
从结果可以看出,多个物体之间的脚本执行顺序并不是多线程的方式,而是按照上述的规律来执行的,我们这里暂且叫做Unity的“伪多线程”吧,意思大概就是遍历所有物体的脚本,依次执行某个阶段的函数,当这个阶段的函数全部执行完毕之后,才会开始去执行下个阶段的函数。
附工程下载地址:
测试工程例子下载 大家可以自己测试一下。
相关文章推荐
- unity中同一个物体上挂载多个脚本的执行顺序
- Unity中同一个物体上加载的脚本的执行顺序以及点击Button时触发事件的顺序
- Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)
- [Unity-20] Unity不同脚本之间的执行顺序
- unity脚本自带函数执行顺序
- unity 脚本的执行先后顺序
- Unity脚本执行顺序自研框架
- unity脚本执行顺序详解
- Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)
- Unity脚本事件执行的顺序
- unity脚本执行顺序详解
- Unity脚本在层级面板中的执行顺序测试4-附加整理
- unity脚本自带函数执行顺序
- Unity脚本执行顺序
- (转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)
- Unity脚本执行顺序
- Unity笔记 脚本执行顺序 life and times
- Unity脚本事件执行顺序
- Unity脚本执行顺序自研框架
- unity脚本执行顺序