以下测试内容均使用Unity 5.6.2f1版本,WIN7操作系统
脚本执行顺序
- 官方给的顺序是Awake()->OnEnable()->Start()
- 实际这只适用在单个脚本中。当在多个脚本中时,Awake()和OnEnable()的执行顺序是不一定的,比如我有脚本1和脚本2,那执行顺序就是这样的,1_Awake()->1_OnEnable()->2_Awake()->2_OnEnable()。他会先执行完脚本1的Awake()和OnEnable(),再执行脚本2的Awake()和OnEnable()。
OnEnable()事件函数的执行时机
- OnEnable()事件函数的执行时机也是很有意思。
- 以前我以为————如果我在Update()函数里激活了某个游戏物体的脚本,那么这个游戏物体会在Update()结束以后,下一帧开始的时候,执行它的OnEnable()事件函数。
- 然而事实不是这样的,事实是,在激活游戏物体的时候,也就是在gameObject.setActive(True)那一行结束的时候,程序就会跳入被激活游戏物体的OnEnable()事件函数,等执行完OnEnable()以后,在跳回gameObject.setActive(True)的下一行。
- Awake在游戏物体第一次激活的时候执行(即便脚本不激活Awake也会执行)
- OnEnable在脚本每次激活的时候执行
- Start在脚本第一次激活的时候执行
- 为了弄清楚这三个事件函数的执行时机,做测试如下:场景中放置一个cube和一个sphere,cube上挂脚本“Cube”,sphere上挂脚本“Sphere”,然后将cube取消激活,cube上的脚本也取消激活,运行场景。
public class Cube : MonoBehaviour {
private void Awake()
{
Debug.Log("Cube Awake!");
}
private void OnEnable()
{
Debug.Log("Cube OnEnable!");
}
void Start ()
{
Debug.Log("Script Start!");
}
}
public class Sphere : MonoBehaviour {
public GameObject cube;
void Start ()
{
cube.SetActive(true);
Debug.Log("Sphere Set Cube Active!");
cube.GetComponent<ScriptOrderTest>().enabled = true;
Debug.Log("Sphere Set Cube Script Active!");
}
}
- 输出结果如下:
- 1、Cube Awake!
- 2、Sphere Set Cube Active!
- 3、Cube OnEnable!
- 4、Sphere Set Cube Script Active!
- 5、Script Start!
Unity的EventSystem事件顺序
- 试验品为toggle
- 大家都知道点击toggle会出现对号,那么OnPointDown(),OnPointUp(),OnPointClick()执行的时间,和toggle对号出现的时间先后顺序是怎样的呢?
- 在有toggle组件的游戏物体上挂一个脚本,并且实现OnPointDown(),OnPointUp(),OnPointClick()方法,在这些方法内Debug输出各自的方法名称。当点击Toggle的时候就会发现,他们的执行顺序是这样的:
- OnPointDown()->OnPointUp()->Toggle.isOn->OnPointClick()
Unity事件函数与脚本禁用
- 当一个脚本被禁用的时候,脚本内众多的unity事件函数中,只有start,onenable,ondisable,onGUI,update三兄弟,这7个会被禁用掉,其他的诸如awake,onTrigger等等,即使脚本被禁用了,他们还是一样会被触发