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

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