目标
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 里也有对应版本的手册。文章来源:https://www.toymoban.com/news/detail-845578.html
周期方法都在里边了。哪里查?查手册,文章开头已经给了,这里跳转一下,MonoBehaviour API 地址 ,Unity 里也有对应版本的手册。
文章来源地址https://www.toymoban.com/news/detail-845578.html
到了这里,关于Unity 脚本的生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!