Awake()函数
- 当脚本实例被加载时会调用Awake()
- Awake()在所有的游戏对象被初始化完毕之后才会被调用
- 在脚本实例的整个生命周期中,Awake()仅执行一次
- 如果游戏对象的初始状态为关闭状态,那么运行程序,Awake()不会执行;
反之,如果游戏对象的初始状态为开启状态,那么Awake()会执行。
Awake()的执行与否与脚本实例的状态并没有关系,而是与脚本实例所绑定的游戏对象的状态有关。
- 在不切换场景的前提下,原本处于关闭状态的游戏对象,当它被首次开启时,Awake()会执行一次,并且是只在首次开启时才会执行;
而已经开启(**)的游戏对象(Awake()已经执行过一次),将它关闭后再次开启,Awake()不会再次执行。
- 如果重新加载场景,那么场景内Awake()的执行情况重新遵循上述两点。
Start()函数
- 当Update()第一次被调用前会调用一次Start()
- Start()只在脚本实例被启用时才会执行;
- Start()是在Awake()之后执行。
- 如果游戏对象关闭,那么Start()不会执行。
- 如果游戏对象开启,对象上绑定的脚本实例禁用,那么Start()不会执行。
- 如果游戏对象开启,对象上绑定的脚本实例开启,那么Start()会执行。
Start()只会在脚本实例首次被开启时才会执行。如果是已经开启过的脚本实例被关闭后再次开启,那么Start()不会再次执行
- 如果重新加载场景,那么场景内Start()的执行情况重新遵循上述三点。
总结:
- Awake()在所有游戏对象初始化完之后才会被调用,所以可以安全的在Awake()中引用或请求其它游戏对象数据,诸如GmeObject.Fine和.GetComponent<>()之类的方法。
- 所有游戏对象的Awake()调用顺序是随机的,所以应该全用Awake()来设置脚本之间的引用和给各个组件之间添加引用关系,而使用Start()来互相来回传递信息。
- 尽量在Awake()中进行初始化操作,除非有A依赖B,B必须在A实例化之前完成初始化,那么A在Start(),B放在Awake()中可以保证A在B之后才被初始化。
- 在Start()中进行初始化不是很安全,因为它可能被其他自定义的函数抢先。[创建一个物体添加一个脚本组件后马上运行自定义函数]
题外话:
- 设置游戏物体的状态:gameObject.SetActive(true/false);
- 判断游戏物体的状态:gameObject.activeInHierarchy;
- 设置和判断组件的状态:component.enabled = true/false;
事件函数执行顺序和生命周期:
以下图摘自Unity2017手册:
本文参考于:http://blog.csdn.net/haohan_meng