預制體prefab
什么是預制體,字面意思,還未使用前預先制作好的節(jié)點資源,屬性等同于普通節(jié)點,可以看做一個預先制作還沒展示出來的普通的節(jié)點
怎么創(chuàng)建預制體
1.在層級管理器處先創(chuàng)建普通的節(jié)點,然后把這個節(jié)點拖拽到資源管理器的assets文件夾下,出于方便管理會統(tǒng)一建立一個Prefab文件夾下統(tǒng)一存放預制體
雙擊預制體節(jié)點可以看到它呈現藍色,這時候就可以刪除還留在場景場景里的節(jié)點,需要使用該節(jié)點時,通過預制體創(chuàng)建
這時候可以看到屬性檢查器里的屬性,和普通節(jié)點一致
預制體的作用
1.批量創(chuàng)建相同類型的節(jié)點
本質上來說就是使用預制體創(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; // 判斷對象池內是否有有閑置對象 if(this.nodePools.size() > 0){ // 使用get方法獲取閑置對象,這時候把存放批量創(chuàng)建節(jié)點的對象池nodePools當作參數傳入get里,之后可以在預制體綁定的腳本內(假設是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); 取出對象池內的節(jié)點之后,在預制體的腳本內先定義一個對象池接收上面通過get傳入的對象池 /*這樣當使用 nodePool.get() 獲取節(jié)點后, 就會調用預制體腳本 nodePrefab.ts 里的 reuse 方法,完成點擊事件的注冊。 另外 cc.NodePool.get() 可以傳入任意數量類型的參數,這些參數會被原樣傳遞給 reuse 方法*/ // 所有我們要在實現一個reuse系統(tǒng)回調方法 reuse(EnemyPools:cc.NodePool) { // 獲取到get 中傳入的管理類實例 this.EnemyPools = EnemyPools; } // 寫一個回收對象的函數 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)這樣的掛載方式,就能加載出
// 因為下面的回調函數無法使用this,所以要定義一個變量傳入this let m_this = this; /* 使用cc.loader.loadRes動態(tài)加載 Prefab,先在在assets文件夾下創(chuàng)建一個resources文件夾,然后把預制體資源放到下面 第一個參數是resources下面預制體的絕對路徑,這樣預制體就會被獲取到第二個function類型參數的prefab參數里*/ [cocos文檔官網](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的詳細內容,更多關于cocoscreater prefab的資料請關注服務器之家其它相關文章!
原文鏈接:https://blog.csdn.net/wjysg8408982/article/details/108247214