Unity中Awake、OnEnable和Start的执行顺序

概念分析

void Awake():游戏启动之前用于初始化任何变量和游戏状态,在脚本实例生命周期中仅被调用一次,不能做协程。Awake函数是在所有objects实例化之后被调用的,因而可以安全地同其它objects通信或查询等;同时,Awake函数是在任何Start函数之前被调用的,因而我们可以规定脚本的初始化顺序。objects之间Awake函数的调用没有先后顺序规定,因而可以利用Awake函数建立脚本之间的引用,再使用Start函数来回传递信息。(对于C#、Boo用户,当构造时组件序列化状态没有定义,就应该使用Awake代替构造函数来初始化)。

void Enable(): 只有object是激活状态下才可被调用,在object可用之后被调用,这通常发生于MonoBehaviour实例被创建时,不能做协程。 

void Start(): 如果脚本实例是enabled的,则Start函数在第一帧更新之前被调用,在脚本实例生命周期中仅被调用一次。不论脚本enabled与否,Awake函数都会调用;假如初始化期间脚本disabled,则Start函数就不会与Awake函数在同一帧中被调用。Awake函数和OnEnable函数一定是在Start函数之前调用(好处是:object A实例化代码依赖于object B实例化,B的实例化就应该在Awake阶段完成,A的实例化就在Start阶段完成)。注意:对于添加到场景中的objects,所有脚本的Start函数都会在任何脚本调用Update等函数之前被调用。但是,在gameplay期间实例化objects,就不能强制遵循这个规则了。

执行顺序

在同一个脚本中他们的执行顺序是Awake() —>  Enable() —>  Start()。当然这里说的是同一脚本挂载在同一Object上,同一脚本挂载在不同Object上和不同脚本之间就不是这样了。

首先Awake和OnEnable肯定是先于Start执行的。

那么Awake和OnEnable之间的先后关系呢?

看下面例子,同一个脚本挂载到三个不同的物体上。

打印结果为:

结论:不同脚本(或对象)的Awake和OnEnable之间的执行顺序是没有关系的。

猜你喜欢

转载自blog.csdn.net/qq_38721111/article/details/90270235