Unity3d--Event Functions事件函数【Awake()和Start()】

时间:2024-04-05 11:50:34

Awake()函数

  1. 当脚本实例被加载时会调用Awake()
  2. Awake()在所有的游戏对象被初始化完毕之后才会被调用
  3. 在脚本实例的整个生命周期中,Awake()仅执行一次
  • 如果游戏对象的初始状态为关闭状态,那么运行程序,Awake()不会执行;
    反之,如果游戏对象的初始状态为开启状态,那么Awake()会执行。
    Awake()的执行与否与脚本实例的状态并没有关系,而是与脚本实例所绑定的游戏对象的状态有关。
  • 在不切换场景的前提下,原本处于关闭状态的游戏对象,当它被首次开启时,Awake()会执行一次,并且是只在首次开启时才会执行
    已经开启(**)的游戏对象(Awake()已经执行过一次),将它关闭后再次开启,Awake()不会再次执行
  • 如果重新加载场景,那么场景内Awake()的执行情况重新遵循上述两点。

Start()函数

  1. 当Update()第一次被调用前会调用一次Start()
  2. Start()只在脚本实例被启用时才会执行;
  3. 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手册:

Unity3d--Event Functions事件函数【Awake()和Start()】

本文参考于:http://blog.csdn.net/haohan_meng