Unity 生命周期函数
属于是用了好像是那么回事但是不是很清楚的知识
Awake() 和 Start() 的区别
【Unity笔记】Awake()和Start()的区别 - 霍莉雪特 - 博客园 (cnblogs.com)
Awake()
当一个脚本实例被载入时Awake被调用。Awake用于在游戏开始之前初始化变量或游戏状态。在脚本整个生命周期内它仅被调用一次。Awake在所有对象被初始化之后调用,所以你可以安全的与其他对象对话或用诸如 GameObject.FindWithTag 这样的函数搜索它们。每个游戏物体上的Awake以随机的顺序被调用。因此,你应该用Awake来设置脚本间的引用,并用Start来传递信息。Awake总是在Start之前被调用。它不能用来执行协同程序。
Start()
Start仅在Update函数第一次被调用前调用。Start在behaviour的生命周期中只被调用一次。它和Awake的不同是Start只在脚本实例被启用时调用。 你可以按需调整延迟初始化代码。Awake总是在Start之前执行。这允许你协调初始化顺序。
Awake:
- 初始化函数,游戏开始时系统自动调用
- 一般用来声明变量
- 所挂载的物体被激活时,才能被调用
- 当被添加到物体身上时,就立即被调用
- 无论该脚本组件是否激活,都会被调用
- 所有的Awake函数被调用的先后顺序不一定
- 在所有的Start函数之前被调用
Start:
- 初始化函数,在所有Awake函数运行完之后,Update函数首次运行之前,被调用
- 一般用来给变量赋值
- 所挂载的物体被激活时,才能被调用
- 脚本在代码中被实例化时才开始调用
- 只有该脚本组件被激活时,才能被调用
只要场景中有已激活的物体身上承载该脚本,无论该脚本是否被激活,Awake函数都会被调用。但是只有脚本已被激活,Start函数才能被调用。
FixUpdated的实现原理
Fixed Timestep保证了刚体模拟的实时准确运算,但也会导致一些问题,当游戏中物理运算量比较多时,会导致游戏帧率变低(因为游戏中的物体数量非常多,运算量会非常大)。而游戏的主循环(Update)必须在在常规的物理运算FixedUpdate()调用之间进行,当有大量的物体运算要进行处理时就会在一个主循环帧(Update)当中进行多次物理运算(FixedUpdate).在主循环帧开始的时候,物体的位置和其它属性都是固定不变的,因此在这一帧里显卡所显示的最终结果与更高频率的物理运算结果是不同步的。
FixedUpdate真的是固定的时间间隔执行吗?聊聊游戏定时器 - 知乎 (zhihu.com)
在每次Update卡完后都会执行完应该执行的多次Fixedupdate。比如FixedUpdate设置的是0.5s一次,Update卡了10秒,在卡完Update之后会立即执行20次FixedUpdate,并且在FixedUpdate中获取某些变量,比如Time.time时,获取到的是没有卡的时间,但并不是所有数据,比如DateTime就显示当时的FixedUpdate是一块执行的。
结论:当Update卡了之后,FixedUpdate会尽量模拟没有卡的情况,让开发认为当时是没有卡的。