Unity生命周期

对于父子级: 当子级没有某一生命周期函数但父级有,则会调用父级,若父子级都有则调用子级,若想调用父级使用base关键字调用

Awake

在脚本被实例化的时候就会被调用(不管脚本是不是enable的),而且在脚本的生命周期中只会被调用一次。Awake是在所有对象实例化之后,所以我们可以放心大胆地去使用诸如GmeObject.Find之类的方法来在Awake中给各个组件之间添加引用 关系。Awake会在所有对象的Start之前调用,但是注意不同对象之间的Awake顺序是不得而知的。

Start

在对象被第一次enable之后,在Update之前调用的,Start在脚本的生命周期中也只可能被调用一次。Start可能不会被立刻调用,比如我们之前没有让其enable,当脚本被enable时,Start才会被调用。

  • 官方文档的建议是:尽量在Awake函数中进行初始化操作,除非有A依赖B,B必须在A实例化之前完成初始化,那么A在Start,B放在Awake中可以保证A在B之后才被初始化(不过个人感觉还是应该尽量都在Awake中进行对象间的引用,然后手动调用Init函数进行初始化,这样可以自己控制初始化的顺序)。 alt

FixedUpdate

FixedUpdate每一帧都被调用,常用来更新一些物理属性比如Force,Collider,Rigidbidy,以及外设的输入输出。FixedUpdate的每帧之间的事件是固定的,可以在Project Setting中进行设置。

Update

Update每一帧都被调用,但是帧之间的时间间隔不固定,受当前渲染游戏对象的影响。 多个Update的执行顺序不固定。

LateUpdate

LateUpdate在所有Update调用完成后被调用。可以用于调整脚本的执行顺序,LateUpdate 开始时,在 Update 中执行的所有计算便已完成。

比如跟随游戏对象的相机可以在LateUpdate中实现,这样可以确保游戏对象在相机跟踪其位置之前已完全移动。

Unity后台主线程将 Update,LateUpdate 制作成两个多线程 先去执行Update的线程,等Update 执行完毕后 在去执行LateUpdate线程。

因为多个update函数是先后顺序是随机的,所以可能摄像机先update而物体还未移动,而下一帧是若物体先update那么就会出现瞬移的情况。多数摄像机都要加上LateUpdate,即所有场景内的调用结束后再更新摄像机。

Unity按Ctrl键移动,移动固定长度一米;

当游戏对象自身处于未激活状态时,其碰撞器依旧可以被检测到,解决方法:将碰撞器取消激活;

获取系统时间:DateTime类;

Pixels Per Unit:世界坐标中标准单位(一米)所占像素;

例:Pixels Per Unit = 70 :每个标准单位中有70个像素;

测试阶段打包时打开DevelopmentBuild,可以生成日志文件