Unity 脚本的生命周期

本文详细解释了Unity脚本的生命周期阶段,包括Awake、Start、Update、FixedUpdate的触发时机和应用场景,以及碰撞和交互事件的处理。重点强调了初始化和更新部分,并提供了查阅Unity手册的链接。
摘要由CSDN通过智能技术生成

目标

Unity 脚本的生命周期有哪些?什么时机会触发/执行?什么时候用?

过程

手册

Unity 手册地址

生命周期

初始化

方法说明:

  • Awake:当物体载入时立即调用一次,在 Start 函数之前调用。
  • OnEnable:在脚本对象启用时调用。
  • Start:仅当启用脚本实例时,才会在第一帧调用。
  • Reset:编辑器下调用,当脚本第一次附加到物体上或者点击 Reset 时执行,来初始化脚本属性。

实际应用:

  • Awake:通常使用为需要提前初始化的逻辑。比如单例赋值private void Awake(){Instance = this;}

  • OnEnable:处理每次显示时都需要进行初始化的逻辑,通常和 OnDisable 配合使用。比如: 游戏逻辑使用并修改了变量Number,而下次显示时使用是又需要Number = 1,此时就可以写private void Awake(){Number = 1;}

  • Start:通常使用为一些变量初始化逻辑。比如:获取指定物体:private void Start(){child1 = transform.GetChild(0);}

  • Reset:通常在游戏测试调试时,使用编辑器下的初始化。通过点击 Reset 执行一个逻辑。

Awake 和 Start 直到销毁只执行一次。Awake 先于 Start,不管脚本启用还是禁用都会执行,常用于在游戏开始前进行初始,可以判断当满足某种条件执行此脚本 this.enable=true。

更新

方法说明:

  • FixedUpdate:固定时间调用,FixedUpdate 通常比 Update 更频繁地调用。

  • Update:每帧调用一次。

  • LateUpdate:在 Update 完成后,每帧调用一次。

实际应用

  • FixedUpdate:所有物理计算和更新都在 FixedUpdate 中处理。它是固定时间调用,不会受到帧率影响。比如:一些物理属性的更新操作 Force,Collider,Rigidbody 等。

  • Update:每帧调用一次,根据帧率的快慢影响执行速度。通常的游戏逻辑都写在这里,比如:和玩家交换,当用户按下空格时进行执行什么操作。

  • LateUpdate:每次 Update 完成后调用移除。常见用处是相机跟随主角,比如:主角在 Update 中移动,则可以在 LateUpdate 执行相机的移动,这将可以保证摄像机跟着的时候之前的逻辑一起完全执行完成。

FixedUpdate 默认为0.02s 执行一次,可以在 Edit => Project Setting => Time => Fixed Timestep中设置更新频率,一般不建议修改这个值,因为改大了碰撞检测不到,改小了性能消耗变大。

Update 执行间隔不固定,手游30-40帧,pc游戏40-50帧,vr一般要大于70帧。

既然Update执行后必定会执行LateUpdate,那为什么不放在一起执行呢?如果把摄像机跟随的代码放在 Update 中合并执行,那么有可能摄像机跟随的代码会先一步执行完成。

碰撞

碰撞函数

  • OnCollisionEnter: 进入碰撞时触发一次。

  • OnCollisionStay: 在碰撞体中停留时每帧触发一次。

  • OnCollisionExit: 离开碰撞体时触发一次。

触发函数

  • OnTriggerEnter: 进入碰撞体时触发一次。

  • OnTriggerStay: 在碰撞体中停留时每帧触发一次。

  • OnTriggerExit: 离开碰撞体是触发一次。

PS:上面这六个方法,还有对应 2D 碰撞体的六个方法(如:OnCollisionEnter2D) 函数后面添加 2D 接口,触发条件和使用方式和 3D 一致。 使用时注意碰撞体和检测函数同步接口,即用 2D 碰撞体必须用 2D 函数。

函数执行条件

  • 两个物体需要都有碰撞体(Collider)组件。

  • 检测方(挂载脚本物体)需要有刚体(Rigidbody)组件。

  • Collider 上都不勾选 IsTrigger(有一方勾选则执行触发函数)。

交互

方法说明

  • OnMouseEnter: 鼠标进入时调用一次。

  • OnMouseOver: 鼠标停留(经过)时一直调用。

  • OnMouseExit::鼠标退出时调用一次。

  • OnMouseDown:鼠标按下时调用一次。

  • OnMouseDrag:鼠标拖拽(按住)时一直调用。

  • OnMouseUp:鼠标抬起时调用一次。

实际应用

使用时一般都是成对使用。

  • OnMouseEnter,OnMouseOver,OnMouseExit 一组。比如模拟选中状态:鼠标进入时物体变色,鼠标退出时再变回来。

  • OnMouseDown,OnMouseDrag,OnMouseUp 一组。比如射击游戏:鼠标按下拖拽时调整方向,抬起时发射子弹。

  • 当鼠标按下并停留在当前游戏对象上时,OnMouseOver,OnMouseDrag 会同时触发。

检测原理

  • 只能检测当前脚本挂载的游戏对象。

  • 当前游戏对象需要有碰撞体。Edit => Project Settings => Physics 中的 Queries Hit Triggers。可以启用和关闭碰撞。

  • 不能有其他物体(UI)遮挡到此游戏对象。

渲染

方法说明:

  • OnBecameVisible:当 Mesh Renderer 在任何相机上可见时调用。

  • OnBecameInvisible:当 Mesh Renderer 在任何相机上都不可见时调用。

销毁

方法说明:

  • OnDisable:对象变为不可用或者附属游戏对象非激活状态时此函数被调用。
  • OnDestroy:当脚本销毁或者附属游戏对象被销毁时此函数被调用。
  • OnApplicationQuit:当应用程序退出时被调用。

实际应用

  • OnDisable: 通常和 OnEnable 配合使用。比如:在 OnEnable 添加监听,在 OnDisable 移除监听

  • OnDestroy: 当物体销毁或者场景关闭时触发。比如:子弹打到墙壁时,需要销毁子弹并触发一个打击音效。

结果

这些不用全部记住,弄清楚生命周期就行,要用的时候知道去查。重点的部分为初始化和更新。还有很多的生命周期方法,这里没有写全,有些生命周期可能永远也不会的用上,用的上的时候去查就行了。

生命周期是 MonoBehaviour 类中的方法,所有的生命周期方法都在里边了。哪里查?查手册,文章开头已经给了,这里跳转一下,MonoBehaviour API 地址 ,Unity 里也有对应版本的手册。

周期方法都在里边了。哪里查?查手册,文章开头已经给了,这里跳转一下,MonoBehaviour API 地址 ,Unity 里也有对应版本的手册。
生命周期图

  • 51
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值