詳解cocoscreater預制體prefab
預制體prefab
什么是預制體,字面意思,還未使用前預先制作好的節(jié)點資源,屬性等同于普通節(jié)點,可以看做一個預先制作還沒展示出來的普通的節(jié)點
怎么創(chuàng)建預制體
1.在層級管理器處先創(chuàng)建普通的節(jié)點,然后把這個節(jié)點拖拽到資源管理器的assets文件夾下,出于方便管理會統(tǒng)一建立一個Prefab文件夾下統(tǒng)一存放預制體
雙擊預制體節(jié)點可以看到它呈現(xiàn)藍色,這時候就可以刪除還留在場景場景里的節(jié)點,需要使用該節(jié)點時,通過預制體創(chuàng)建
這時候可以看到屬性檢查器里的屬性,和普通節(jié)點一致
預制體的作用
1.批量創(chuàng)建相同類型的節(jié)點
本質(zhì)上來說就是使用預制體創(chuàng)建一個模板,然后通過復制這個預制體模板批量創(chuàng)建
第一步:批量創(chuàng)建節(jié)點放入對象池
@property(cc.Prefab) prefab:cc.Prefab = null; // 在屬性管理器上聲明一個預制體類型,用于在屬性管理器里掛載定義好的預制體 @property(cc.NodePool) nodePools:cc.NodePool = null; // 聲明一個對象池用于存放通過預制體創(chuàng)建對象,一次性使用預制體創(chuàng)建足夠用的相同類型節(jié)點,然后放入對象池,需要使用時拿出來,不需要時放回,避免長時間大量創(chuàng)建和銷毀節(jié)點 for(let i:number = 0; i < 100; i++){ //創(chuàng)建100個節(jié)點 let node:cc.Node = cc.instantiate(this.prefab); this.nodePools.put(node); // 將每個節(jié)點放入對象池 }
第二步:需要使用時直接拿出使用即可
let node:cc.Node = null; // 判斷對象池內(nèi)是否有有閑置對象 if(this.nodePools.size() > 0){ // 使用get方法獲取閑置對象,這時候把存放批量創(chuàng)建節(jié)點的對象池nodePools當作參數(shù)傳入get里,之后可以在預制體綁定的腳本內(nèi)(假設是nodePrefab.ts),進行放回對象池操作 node = this.nodePools.get(this.nodePools); }else{ // 如果沒有閑置對象就通過預制體創(chuàng)建 node = cc.instantiate(this.prefab); } // 掛載到父節(jié)點上,等同于手動拖拽掛載 this.node.addChild(node);
第三步:使用完之后返還節(jié)點
// 假設這是上面提到的預制體腳本nodePrefab.ts腳本 nodePools:cc.NodePool = null; // 上面通過 node = this.nodePools.get(this.nodePools); 取出對象池內(nèi)的節(jié)點之后,在預制體的腳本內(nèi)先定義一個對象池接收上面通過get傳入的對象池 /*這樣當使用 nodePool.get() 獲取節(jié)點后, 就會調(diào)用預制體腳本 nodePrefab.ts 里的 reuse 方法,完成點擊事件的注冊。 另外 cc.NodePool.get() 可以傳入任意數(shù)量類型的參數(shù),這些參數(shù)會被原樣傳遞給 reuse 方法*/ // 所有我們要在實現(xiàn)一個reuse系統(tǒng)回調(diào)方法 reuse(EnemyPools:cc.NodePool) { // 獲取到get 中傳入的管理類實例 this.EnemyPools = EnemyPools; } // 寫一個回收對象的函數(shù) hit () { // 判斷對象池是否存在 if(this.nodePools){ // 存在放回當前節(jié)點 this.nodePools.put(this.node); }else{ // 否則直接銷毀節(jié)點 this.node.destroy(); } }
2.提前制作一些特定時機才需要展示出來的節(jié)點
比如提示框之類的
// 創(chuàng)建一個預制體用于屬性檢查器里掛載定義好的預制體 @property(cc.Prefab) testPrefab:cc.Prefab = null; // 需要展示這個節(jié)點的時候直接像上面一樣復制通預制體創(chuàng)建 let node = cc.instantiate(this.testPrefab); // 掛載到父節(jié)點上 this.node.addChild(node);
上面都是使用掛載,下面使用一種動態(tài)加載,這樣可以不通過 @property(cc.Prefab)這樣的掛載方式,就能加載出
// 因為下面的回調(diào)函數(shù)無法使用this,所以要定義一個變量傳入this let m_this = this; /* 使用cc.loader.loadRes動態(tài)加載 Prefab,先在在assets文件夾下創(chuàng)建一個resources文件夾,然后把預制體資源放到下面 第一個參數(shù)是resources下面預制體的絕對路徑,這樣預制體就會被獲取到第二個function類型參數(shù)的prefab參數(shù)里*/ [cocos文檔官網(wǎng)](https://docs.cocos.com/creator/manual/zh/scripting/load-assets.html?h=assets) cc.loader.loadRes("assets/OptionBox", function (err, prefab) { if(!prefab){ cc.log("預制體為空"); } var newNode = cc.instantiate(prefab); if(!newNode){ cc.log("節(jié)點為空"); } // 添加為當前節(jié)點的子節(jié)點 m_this.node.addChild(newNode);
以上就是兩種常規(guī)使用預制體的方案,例如批量創(chuàng)建敵人,子彈使用的是第一種,第二種在有反復使用的場景,或者特定情況觸發(fā)的提示框也可以做成預制體
以上就是詳解cocoscreater預制體prefab的詳細內(nèi)容,更多關于cocoscreater prefab的資料請關注腳本之家其它相關文章!
- 詳解CocosCreator制作射擊游戲
- 如何在CocosCreator里畫個炫酷的雷達圖
- 詳解CocosCreator MVC架構(gòu)
- 詳解CocosCreator消息分發(fā)機制
- CocosCreator入門教程之網(wǎng)絡通信
- 如何用CocosCreator制作微信小游戲
- 詳解CocosCreator系統(tǒng)事件是怎么產(chǎn)生及觸發(fā)的
- 怎樣在CocosCreator中使用游戲手柄
- 詳解CocosCreator華容道數(shù)字拼盤
- 詳解CocosCreator游戲之魚群算法
- 詳解CocosCreator優(yōu)化之DrawCall
- CocosCreator實現(xiàn)技能冷卻效果
- python實現(xiàn)socket簡單通信的示例代碼
- python和websocket構(gòu)建實時日志跟蹤器的步驟
- Java通過Socket實現(xiàn)簡單多人聊天室
- 如何在CocosCreator中使用http和WebSocket
相關文章
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方
本篇文章主要介紹了javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法)需要的朋友可以過來參考下,希望對大家有所幫助2013-12-12基于JavaScript實現(xiàn)永遠加載不滿的進度條
各位開發(fā)大佬,平時肯定見到過這種進度條吧,一直在加載,但等了好久都是在99%,那如何用JavaScript實現(xiàn)這一效果呢,下面就來和大家詳細講講2023-04-04