公司注册网站查询,百度统计登录,wordpress安装语言选择,企业网站优化平台http://www.xuanyusong.com/archives/2378 Unity是不支持多线程的#xff0c;也就是说我们必须要在主线程中操作它#xff0c;可是Unity可以同时创建很多脚本#xff0c;并且可以分别绑定在不同的游戏对象身上#xff0c;他们各自都在执行自己的生命周期感觉像是多线程也就是说我们必须要在主线程中操作它可是Unity可以同时创建很多脚本并且可以分别绑定在不同的游戏对象身上他们各自都在执行自己的生命周期感觉像是多线程并行执行脚本的它是如何执行的呢 我们做一个小小的实验来验证它。如下图所示在Hierarchy视图中创建三个游戏对象在Project视图中创建三条脚本然后按照顺序将脚本绑定在对应的游戏对象身上。 三条脚本的代码完全一样只是做了一点名称上的区分代码写的比较丑我们只是作为测试 view source 01using UnityEngine; 02using System.Collections; 03 04public class Script0 : MonoBehaviour 05{ 06 07 void Awake () 08 { 09 Debug.Log(Script0 Awake); 10 } 11 12 bool isUpdate false; 13 void Update () 14 { 15 if(!isUpdate) 16 { 17 Debug.Log(Script0 Update); 18 isUpdate true; 19 } 20 } 21 22 bool isLateUpdate false; 23 void LateUpdate() 24 { 25 if(!isLateUpdate) 26 { 27 Debug.Log(Script0 LateUpdate); 28 isLateUpdate true; 29 } 30 } 31} 播放游戏看看他们的执行顺序。如下图所示Awake、Update、LateUpdate、无论播放游戏多少次他们执行的顺序是完全一样的。 接着我们在做一个测试把Script0的Update方法注释掉 view source 01using UnityEngine; 02using System.Collections; 03 04public class Script0 : MonoBehaviour 05{ 06 07 void Awake () 08 { 09 Debug.Log(Script0 Awake); 10 } 11 12// bool isUpdate false; 13// void Update () 14// { 15// if(!isUpdate) 16// { 17// Debug.Log(Script0 Update); 18// isUpdate true; 19// } 20// } 21 22 bool isLateUpdate false; 23 void LateUpdate() 24 { 25 if(!isLateUpdate) 26 { 27 Debug.Log(Script0 LateUpdate); 28 isLateUpdate true; 29 } 30 } 31} 播放游戏在看看它的结果。脚本的执行顺序和以前完全一样Script0即使删除掉了Update方法但是它也不会直接执行LateUpdate方法而是等待Script1和Script2的Update方法都执行完毕以后在去执行所有的LateUpdate方法。 通过这两个例子我们就可以清楚的断定Unity后台是如何执行脚本的了。每个脚本的Awake、Update、LateUpdate、FixedUpdate等等方法在后台都有一个总汇。 后台的Awake() { 脚本0中的Awake(); 脚本1中的Awake() 脚本2中的Awake(); } 后台的方法 Awake、Update、LateUpdate、FixedUpdate等等都是按照顺序等所有子脚本中的Awake执行完毕后在去执行 Start 、Update、LateUpdate等等。所以这里也就解释了Unity没有多线程的概念。 后台的Update() { 脚本0中的Update(); 脚本1中的Update() 脚本2中的Update(); } Unity还提供的一组协同任务的方法其实它的原理和上面的完全一样它们都是假的多线程。说了一圈我们又回到了Unity脚本的执行顺序上来我们在看两条脚本 在脚本2的Awake方法中创建一个立方体对象。 view source 01using UnityEngine; 02using System.Collections; 03 04public class Script2 : MonoBehaviour 05{ 06 void Awake () 07 { 08 GameObject.CreatePrimitive(PrimitiveType.Cube); 09 } 10} 在脚本0的Awake方法中去获取这个立方体对象 view source 01using UnityEngine; 02using System.Collections; 03 04public class Script0 : MonoBehaviour 05{ 06 07 void Awake () 08 { 09 GameObject go GameObject.Find(Cube); 10 Debug.Log(go.name); 11 } 12 13} 如果脚本的执行顺序是 先执行Script2 然后在执行Script0那么Script0中的Awake就可以获取到该立方体对象可是如果脚本的执行顺序是先Script0然后在Script2那么Script0肯定会报空指针错误的。 那么实际项目中的脚本会非常非常多他们的先后顺序我们谁也不知道。所以我的建议一般在Awake方法中创建游戏对象或在Resources.Load(Prefab) 对象。在Start方法中去获取游戏对象或者游戏组件这样就可以确保万无一失了。 如果说你非要控制脚本的执行先后顺序也不是完全不行Unity可以设置脚本执行的顺序。如下图所示选择任意脚本在Inspector视图中点击Execution Order..按钮。 如下图所示点击右下角的“”将弹出下拉窗口包括游戏中的所有脚本。添加脚本完毕后Default Time下方数值越小的排在越前面脚本将率先执行如果没有设置的脚本将按默认的顺序执行。 按照我的这个设置程序将先执行Script0然后Script1最后Script2欢迎一起讨论哇咔咔。。转载于:https://www.cnblogs.com/hisiqi/p/3204870.html