生命周期
onLoad
onEnable
start
update
lateUpdate
onDisable
onDestroy
测试场景
NodePool中的生命周期
生命周期回调
https://docs.cocos.com/creator/manual/zh/scripting/life-cycle-callbacks.html
1生命周期回调
onLoad
脚本组件的初始化阶段,当脚本组件所在节点首次激活时,或者节点处于激活状态下,脚本组件被挂载到节点(addComponent)时触发
onEnable
当脚本组件的 enabled 属性从 false 变为 true 时,或者所在节点的 active 属性从 false 变为 true 时触发
start
在脚本组件第一次激活前,也就是第一次执行 update 之前触发
update
游戏开发的一个关键点是在每一帧渲染前更新物体的行为,状态和方位。这些更新操作通常都放在 update 回调中
lateUpdate
update 会在所有动画更新前执行,但如果我们要在动效(如动画、粒子、物理等)更新之后才进行一些额外操作,或者希望在所有组件的 update 都执行完之后才进行其它操作,那就需要用到 lateUpdate 回调
onDisable
当脚本组件的 enabled 属性从 true 变为 false 时,或者所在节点的 active 属性从 true 变为 false 时,或者该脚本组件被移除(removeComponent)时触发
onDestroy
当脚本组件或者所在节点调用了 destroy() 时 ,或者该脚本组件被移除(removeComponent)时触发,并在当帧结束时统一回收组件
一个组件从初始化到激活,再到最终销毁的完整生命周期函数调用顺序为:onLoad → onEnable → start → update → lateUpdate → onDisable → onDestroy
脚本组件的存在依赖于节点,但其生命周期是独立存在的
也就是说当节点创建(parent),激活(active)和销毁(destroy)时,会触发该节点上脚本组件的生命周期,但当节点操作脚本组件,创建(addComponent),激活(enabled)和销毁(removeComponent)时,也会触发脚本组件完整的生命周期
2测试场景
创建一个测试场景,在场景中拖入sprite和button控件
button用来控制节点的销毁(destroy)或者节点上脚本组件的销毁(removeComponent)
创建一个脚本组件挂载到sprite控件中
sprite控件中属性检查器
脚本组件中的全部内容
const { ccclass, property } = cc._decorator;@ccclassexport default class SpiteScript extends cc.Component { // LIFE-CYCLE CALLBACKS: onLoad() { console.log("onLoad"); // this.enabled = false; } onEnable() { console.log("onEnable"); // this.enabled = false; } start() { console.log("start"); // this.enabled = false; } update(dt) { console.log("update : " + dt); } lateUpdate(dt) { console.log("lateUpdate : " + dt); } onDisable() { console.log("onDisable"); } onDestroy() { console.log("onDestroy"); }}
case 1:激活节点,激活脚本组件
启动游戏后
点击销毁后
case 2:禁用节点,激活脚本组件
启动游戏后和点击销毁后
case 3:激活节点,禁用脚本组件
启动游戏后
点击销毁后
case 4:激活节点,激活脚本组件,在 onLoad 中添加 enabled
onLoad() { console.log("onLoad"); this.enabled = false;}
启动游戏后
点击销毁后
case 5:激活节点,激活脚本组件,在 onEnable 中添加 enabled
onEnable() { console.log("onEnable"); this.enabled = false;}
启动游戏后
点击销毁后
case 6:激活节点,激活脚本组件,在 start 中添加 enabled
start() { console.log("start"); this.enabled = false;}
启动游戏后
点击销毁后
还有一个有趣的现象,当我们的脚本中没有任何生命周期函数时,在编辑器的界面里,它是这样的
但不影响该脚本的代码执行
2NodePool 中的生命周期
当节点在 NodePool 中时
onLoad start 只会在节点第一次从 NodePool 中取出时触发
onEnable 当节点从 NodePool 中取出时触发
onDisable 当节点被放回 NodePool 时触发
onDestroy 当 NodePool 被 clear 时触发
在 NodePool 中也可以使用 unuse 和 reuse 函数
长按关注获取更多笔记和源码公众号:CocosCreator笔记