欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解cocoscreater預(yù)制體prefab

 更新時間:2021年04月15日 09:31:35   作者:wjysg8408982  
這篇文章主要介紹了詳解cocoscreater預(yù)制體prefab的作用和使用方法,對此感興趣的同學(xué),可以回去試一試

預(yù)制體prefab

什么是預(yù)制體,字面意思,還未使用前預(yù)先制作好的節(jié)點(diǎn)資源,屬性等同于普通節(jié)點(diǎn),可以看做一個預(yù)先制作還沒展示出來的普通的節(jié)點(diǎn)

怎么創(chuàng)建預(yù)制體

1.在層級管理器處先創(chuàng)建普通的節(jié)點(diǎn),然后把這個節(jié)點(diǎn)拖拽到資源管理器的assets文件夾下,出于方便管理會統(tǒng)一建立一個Prefab文件夾下統(tǒng)一存放預(yù)制體

雙擊預(yù)制體節(jié)點(diǎn)可以看到它呈現(xiàn)藍(lán)色,這時候就可以刪除還留在場景場景里的節(jié)點(diǎn),需要使用該節(jié)點(diǎn)時,通過預(yù)制體創(chuàng)建

這時候可以看到屬性檢查器里的屬性,和普通節(jié)點(diǎn)一致

預(yù)制體的作用

1.批量創(chuàng)建相同類型的節(jié)點(diǎn)

本質(zhì)上來說就是使用預(yù)制體創(chuàng)建一個模板,然后通過復(fù)制這個預(yù)制體模板批量創(chuàng)建

第一步:批量創(chuàng)建節(jié)點(diǎn)放入對象池

 @property(cc.Prefab)
 prefab:cc.Prefab = null;
 // 在屬性管理器上聲明一個預(yù)制體類型,用于在屬性管理器里掛載定義好的預(yù)制體
 
 @property(cc.NodePool)
 nodePools:cc.NodePool = null;
 // 聲明一個對象池用于存放通過預(yù)制體創(chuàng)建對象,一次性使用預(yù)制體創(chuàng)建足夠用的相同類型節(jié)點(diǎn),然后放入對象池,需要使用時拿出來,不需要時放回,避免長時間大量創(chuàng)建和銷毀節(jié)點(diǎn)

 for(let i:number = 0; i < 100; i++){
 	//創(chuàng)建100個節(jié)點(diǎn)
 	let node:cc.Node = cc.instantiate(this.prefab); 
    this.nodePools.put(node); 
    // 將每個節(jié)點(diǎn)放入對象池
 }

第二步:需要使用時直接拿出使用即可

let node:cc.Node = null;
// 判斷對象池內(nèi)是否有有閑置對象
if(this.nodePools.size() > 0){
	  // 使用get方法獲取閑置對象,這時候把存放批量創(chuàng)建節(jié)點(diǎn)的對象池nodePools當(dāng)作參數(shù)傳入get里,之后可以在預(yù)制體綁定的腳本內(nèi)(假設(shè)是nodePrefab.ts),進(jìn)行放回對象池操作
      node = this.nodePools.get(this.nodePools);
}else{
	 // 如果沒有閑置對象就通過預(yù)制體創(chuàng)建
      node = cc.instantiate(this.prefab);
}
//  掛載到父節(jié)點(diǎn)上,等同于手動拖拽掛載
    this.node.addChild(node);

第三步:使用完之后返還節(jié)點(diǎn)

// 假設(shè)這是上面提到的預(yù)制體腳本nodePrefab.ts腳本

nodePools:cc.NodePool = null;
// 上面通過 node = this.nodePools.get(this.nodePools); 取出對象池內(nèi)的節(jié)點(diǎn)之后,在預(yù)制體的腳本內(nèi)先定義一個對象池接收上面通過get傳入的對象池

/*這樣當(dāng)使用 nodePool.get() 獲取節(jié)點(diǎn)后,
就會調(diào)用預(yù)制體腳本 nodePrefab.ts 里的 reuse 方法,完成點(diǎn)擊事件的注冊。
另外 cc.NodePool.get() 可以傳入任意數(shù)量類型的參數(shù),這些參數(shù)會被原樣傳遞給 reuse 方法*/
// 所有我們要在實(shí)現(xiàn)一個reuse系統(tǒng)回調(diào)方法
 reuse(EnemyPools:cc.NodePool) {
 		//  獲取到get 中傳入的管理類實(shí)例
        this.EnemyPools = EnemyPools;
 }
 
// 寫一個回收對象的函數(shù) 
hit () {
	// 判斷對象池是否存在
    if(this.nodePools){
    	// 存在放回當(dāng)前節(jié)點(diǎn)
    	this.nodePools.put(this.node);
    }else{
    	// 否則直接銷毀節(jié)點(diǎn)
      	this.node.destroy();
    }
}

2.提前制作一些特定時機(jī)才需要展示出來的節(jié)點(diǎn)

比如提示框之類的

 // 創(chuàng)建一個預(yù)制體用于屬性檢查器里掛載定義好的預(yù)制體
 @property(cc.Prefab)
  testPrefab:cc.Prefab = null;
	
	// 需要展示這個節(jié)點(diǎn)的時候直接像上面一樣復(fù)制通預(yù)制體創(chuàng)建
	let node = cc.instantiate(this.testPrefab);
	// 掛載到父節(jié)點(diǎn)上
    this.node.addChild(node);
    

上面都是使用掛載,下面使用一種動態(tài)加載,這樣可以不通過 @property(cc.Prefab)這樣的掛載方式,就能加載出

// 因?yàn)橄旅娴幕卣{(diào)函數(shù)無法使用this,所以要定義一個變量傳入this
let m_this = this;
/* 使用cc.loader.loadRes動態(tài)加載 Prefab,先在在assets文件夾下創(chuàng)建一個resources文件夾,然后把預(yù)制體資源放到下面
第一個參數(shù)是resources下面預(yù)制體的絕對路徑,這樣預(yù)制體就會被獲取到第二個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("預(yù)制體為空");
}
var newNode = cc.instantiate(prefab);
if(!newNode){
    cc.log("節(jié)點(diǎn)為空");
}
// 添加為當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)
m_this.node.addChild(newNode);

以上就是兩種常規(guī)使用預(yù)制體的方案,例如批量創(chuàng)建敵人,子彈使用的是第一種,第二種在有反復(fù)使用的場景,或者特定情況觸發(fā)的提示框也可以做成預(yù)制體

以上就是詳解cocoscreater預(yù)制體prefab的詳細(xì)內(nèi)容,更多關(guān)于cocoscreater prefab的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論