Unity3D中脚本的执行顺序和编译顺序
先说一下执行顺序吧。
官方给出的脚本中事件函数
的执行顺序如下图:
官方给出的脚本中事件函数
的执行顺序如下图:
然后我们来看看这样一种情况:在脚本
0
的
Awake
方法中创建一个立方体对象,然后在脚本
1
的
Awake
方法中去获取这个立方体对象。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
// Script0.cs
using UnityEngine;
using System.Collections;
public class Script0 : MonoBehaviour
{
void Awake ()
{
GameObject.CreatePrimitive(PrimitiveType.Cube);
}
}
// Script1.cs
using UnityEngine;
using System.Collections;
public class Script1 : MonoBehaviour
{
void Awake ()
{
GameObject go = GameObject.Find("Cube");
Debug.Log(go.name);
}
}
|
如果脚本的执行顺序是先执行
Script0
,然后再执行
Script1
,那么
Script1
中的
Awake
就可以正确地获取到该立方体对象;
可是如果脚本的执行顺序是先执行
Script1
,然后是
Script0
,那么
Script1
肯定会报空指针错误的。
同理,在项目中的委托事件,如果相同情况下,在
Script1
中建立委托,
Scripts0
委托事件。
如果脚本的执行顺序先执行
Scripts0,
后执行
Scripts1
那么依然会报空指针错误。
解决的办法下面讲。
实际项目中的脚本会非常多,它们的先后执行顺序到现在还没有完全清楚
(
有人说是按照栈结构来执行的,即后绑定到游戏对象上的脚本先执行。这一点可以从上面的例子中得到,但官方并没有这么说
)
。
通常,我建议在
Awake
方法中创建游戏对象或
Resources.Load(Prefab)
对象,然后在
Start
方法中去获取游戏对象或者组件,因为事件函数的执行顺序是固定的,这样就可以确保
万无一失了。
当出现需要手动调整函数的执行顺序,可以用下面一种方法。
Unity提供了一个方法来设置脚本的执行顺序,在Edit-> Project Settings -> Script Execution Order菜单项中,可以在Inspector面板中看到如下图所示:
点击右下角的
"+"
将弹出下拉窗口,包括游戏中的所有脚本。
脚本添加完毕后,可以修改脚本的排序的的时间数字,脚本名后面的时间数字也越小,脚本也就越先执行。
也就是说,
-400
会比
700
优先执行,
5
会比
700
优先执行。
其中的
Default Time
表示
Unity
默认设置脚本的执行顺序的那些脚本的执行顺序
Unity
后台是如何执行脚本的了。总的来说就是每个脚本的
Awake
、
Start
、
Update
、
LateUpdate
、
FixedUpdate
等等,所有的方法在后台都会被汇总到一起:
后台的方法
Awake
、
Update
、
LateUpdate
等等,都是按照顺序,等所有游戏对象上脚本中的
Awake
执行完毕之后,再去执行
Start
、
Update
、
LateUpdate
等方法的。
以上内容参考了
Champ_Keh unity3d中脚本的执行顺序和编译顺序