生命周期销毁组件_Creator | 脚本组件的生与死生命周期回调时机/NodePool中的生命周期回调...

本文详细介绍了Unity中脚本组件的生命周期,包括onLoad、onEnable、start、update、lateUpdate、onDisable和onDestroy等回调的触发条件和应用场景。通过不同测试场景展示了节点和脚本组件在不同状态下的行为,特别提到了NodePool中的生命周期回调,如onLoad仅在节点首次取出时触发,而onDisable则在节点放回NodePool时触发。
摘要由CSDN通过智能技术生成

644904752a4350cf580f91f0e7d8c7d5.gif

导读

生命周期

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)

6897d4ce5eeef5d828d0308c6640519a.png

aa0db9eff90fe3c91726c53a6828face.png

创建一个脚本组件挂载到sprite控件中

sprite控件中属性检查器

9fe1f82cf509e3d31e283ebcdff22391.png

脚本组件中的全部内容

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:激活节点,激活脚本组件

065d2cfe8c6135fb0ffd267e1c23d55f.png

启动游戏后

0fb22b6aee11907e3ec03baa376b8872.png

点击销毁后

1b8047ca36a402dae00a98d6d5818723.png

case 2:禁用节点,激活脚本组件

d15ddae3a5caa2a6b9ebbf3f21a419c8.png

启动游戏后和点击销毁后

d7b5b9161b70927c0eb9afd05fe53402.png

case 3:激活节点,禁用脚本组件

fb4b0a23369e54ae1565761a971dc8ec.png

启动游戏后

5cef0a99d7b3155dbf5674660c275bd7.png

点击销毁后

34552f0d709d5c386c10d0042a5ed39c.png

case 4:激活节点,激活脚本组件,在 onLoad 中添加 enabled

onLoad() {  console.log("onLoad");  this.enabled = false;}

启动游戏后

63aad94c03d0f8e004266ae89cf3a642.png

点击销毁后

6a6b68235ac5afd19ba70efe2f9823db.png

case 5:激活节点,激活脚本组件,在 onEnable 中添加 enabled

onEnable() {  console.log("onEnable");  this.enabled = false;}

启动游戏后

22d3af6ee4a9242826786600158ee48f.png

点击销毁后

b7954d182583c399da92ece58f5dbaf7.png

case 6:激活节点,激活脚本组件,在 start 中添加 enabled

start() {  console.log("start");  this.enabled = false;}

启动游戏后

848f95d7ced0cefcb85f94a8f2338b03.png

点击销毁后

8d7ec8003ba26bbce87525029e6b0767.png

还有一个有趣的现象,当我们的脚本中没有任何生命周期函数时,在编辑器的界面里,它是这样的

1b41bc7c2b488939ba480e9a4a4f8a46.png

但不影响该脚本的代码执行

2NodePool 中的生命周期

当节点在 NodePool 中时

onLoad start 只会在节点第一次从 NodePool 中取出时触发

onEnable  当节点从 NodePool 中取出时触发

onDisable 当节点被放回 NodePool 时触发

onDestroy 当 NodePool 被 clear 时触发

在 NodePool  中也可以使用 unuse 和 reuse 函数

be81561d63c99eca2f99283cfaaae925.png长按关注获取更多笔记和源码公众号:CocosCreator笔记 719e2585d72ee5964a1850949529a2aa.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值