Creator 新手教程 | 脚本组件的生与死-生命周期回调时机/NodePool中的生命周期回调

长按关注

获取更多笔记和源码

公众号:CocosCreator笔记

 

导读

 

 

生命周期

 

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 函数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章