長按關注
獲取更多筆記和源碼
公衆號: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;
@ccclass
export 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 函數