脚本的生命周期(MonoBehaviour Lifecycle)是Unity官方给出的术语。实际上我们可以简单地将它理解为,一个脚本的创建和销毁两个关键事件,以及在此过程中可能触发的各种事件。这里最关心的是所有事件的种类,以及它们的触发事件,因为脚本逻辑只有写在合适的事件里,且在合适的时机执行,在能恰到好处实现想要的功能。
理解脚本的生命周期
首先要确认,脚本虽然功能强大,但它毕竟是Unity的众多系统之一,完全受到引擎的管理。在脚本中可以编写各种功能,但什么时候脚本会被调用,完全由Unity决定。
以熟悉的Start方法和Update方法为例。当在组件脚本中写下Update方法时,就意味着向引擎"注册"了更新事件。当引擎对所有组件执行更新操作时,也会稍带着个脚本租金。反过来说,如果没有定义Update方法,那么引擎在更新时,就会跳过这个脚本。
可以把引擎每一帧需要做的事,想象成在标准跑道上跑一圈。在跑一圈的过程中会有很多项常规工作,也有一些突发事件需要处理。引擎允许脚本订阅它所挂载物体的各类事件,并运行相应方法。这些事件的种类众多,大体上包括了初始化、物理计算、更新、渲染和析构等方面。
常见的事件方法
事件 |
说明 |
Awake |
脚本被加载后调用,时机早于Start |
Start |
脚本可用的第一帧,正好在第一次Update之前调用 |
Update |
每帧调用 |
LateUpdate |
每帧调用,保证在所有的Update执行过后才执行 |
FixedUpdate |
物理更新,会尽可能保证调用频率 |
OnCollisionEnter |
碰撞开始事件 |
OnCollisionStay |
碰撞持续中 |
OncollisionExit |
结束碰撞 |
OnTriggerEnter |
触发器开始事件 |
OnTriggerStay |
触发持续 |
OnTriggerExit |
触发器结束事件 |
OnParticleCollision |
粒子碰撞时间,Unity的粒子系统也支持物理特性 |
OnParticleSystemStopped |
粒子系统结束 |
OnParticleTrigger |
粒子触发器事件 |
OnGUI |
渲染与处理GUI事件时调用 |
OnEnable |
物体被激活时调用 |
OnDisable |
物体被禁用时调用 |
OnDestroy |
销毁组件时调用 |
OnPreRender |
即将渲染事件,某个摄像机渲染场景时调用 |
OnRenderObject |
渲染事件,某个摄像机渲染场景时调用 |
OnPostRender |
渲染事件后,某个摄像机结束渲染时调用 |
OnWillRenderObject |
每个摄像机渲染非UI的可见物体时调用 |
OnPreCull |
摄像机进行可见性裁剪之前使用 |
OnTransformChildrenChanged |
物体的子物体发生变化时调用 |
OnTransformParentChanged |
物体的父物体发生变化时调用 |
OnApplicationFocus |
Game窗口失去或获得焦点时调用 |
OnApplicationPause |
游戏被暂停时调用 |
OnApplicationQuit |
游戏退出时调用 |
OnBecameVisible |
物体变得可见时调用 |
OnBecameInvisible |
物体变得不可见时调用 |
OnMouseDown |
鼠标在UI元或碰撞体上摁下时调用 |
OnMouseDrag |
鼠标在UI元或碰撞体上持续摁下时调用 |
OnMouseEnter |
鼠标进入UI元素或碰撞体范围时调用 |
OnMouseExit |
鼠标离开UI元素或碰撞体范围时调用 |
OnMouseOver |
鼠标在UI元素u或碰撞体范围内时,每帧调用 |
OnMouseUp |
用户放开鼠标键时调用 |
OnMouseUpAsButton |
用户在同一个UI元素或碰撞体上,松开鼠标按键时调用 |