Laya Ts 簡易對象池


ts版本的簡易對象池 ,目前主要支持3D的物體,也可以將其改成其他類型

要使用首先調用InitPool 方法
`/*
使用說明: 使用必須先調用 InitPool 方法將對象池初始化
然后 DequeueItem 會根據對象池指定的編號 返回編號指定對象池中的一個物體,然后在外部進行信息設置
EnqueueItem 調用對象回池,根據指定編號放置到對應的對象池中
ClearPool 清理對象池,將指定對象池中的物體放到Laya默認的內存回收機制中,等待回收
備注:
使用時需將某一類對象池與該對象池對應的編號對應好,否則使用時會出問題
*/

export default class PoolManager {
static _instance:any;
private node:Laya.Node; //3D物體父節點
public m_ObjectPoolDic:{[key:number]: Laya.MeshSprite3D}={}
constructor() { this. node=new Laya.Node(); this. node.name="Node"; Laya.stage.addChild(this.node);}
static getInstance() {
return this._instance || (this._instance = new PoolManager() )
}

//初始化
//加載到內存中創建出來之后添加到這里面

public InitPool(key:number,MeshSprite: Laya.MeshSprite3D){
//初始化id對應對象池, 第一次初始化則必須保證池中最少存在1個
if (this.m_ObjectPoolDic[key]){
console.log("初始化有誤,該值已經有對應的 對象池了");
}
else{
this.m_ObjectPoolDic[key]=(MeshSprite);
let childNode=new Laya.Node();
childNode.name=key.toString();
this.node.addChild(childNode)
}
}

//按照編號取出對應對象池中的一個物體
public  DequeueItem(key:number): Laya.MeshSprite3D {
    if(this.m_ObjectPoolDic[key])
    {
        let childNode=this.node.getChildByName(key.toString())
        if(childNode.numChildren==0){
             let tempobj= this.m_ObjectPoolDic[key].clone() as  Laya.MeshSprite3D;;
             tempobj.name=key.toString();
             return tempobj;
        }
        else{
            let tempobj=childNode.getChildAt(0)as  Laya.MeshSprite3D; ;
            tempobj.removeSelf();
            return tempobj ;
        }
    }else
    {
        //對象池中不存在該 key 對應的池
        console.log("獲取對象錯誤,沒有 該值所對應的對象池");
        return null;
    }

}

//對象回池,對象的狀態信息,盡可能在回池前設置成默認狀態
// 比如說物體上添加的一些腳本,可以在回池前去掉或者 后面再對腳本進行判斷
//需要記住該物體對象池所對應的指定的編號,否則一旦添加錯誤,無法修改
public  EnqueueItem(key:number,MeshSprite:Laya.MeshSprite3D):void{
    if(this.m_ObjectPoolDic[key])
    {
        //對象池中存在該 key 對應的池
        let childNode=this.node.getChildByName(key.toString())

        MeshSprite.active=false;
        MeshSprite.removeSelf();

        childNode.addChild(MeshSprite);
    }else
    {
        //對象池中不存在該 key 對應的池
        console.log("獲取對象錯誤,沒有 該值所對應的對象池");
        return;
    }
}

//清理對象池 根據編號清理指定的對象池
public ClearPool(key:number):void{
    if(this.m_ObjectPoolDic[key])
    {
        //對象池中存在該 key 對應的池
        let QueuePool=this.m_ObjectPoolDic[key];
        this.m_ObjectPoolDic[key].destroy();
        delete this.m_ObjectPoolDic[key];

        let childNode=this.node.getChildByName(key.toString())
        childNode.destroyChildren();
        childNode.destroy();
    }else
    {
        //對象池中不存在該 key 對應的池
        console.log("獲取對象錯誤,沒有 該值所對應的對象池");
        return ;
    }
}
//獲取對象池長度 根據編號獲取指定的對象池的長度
public GetPoolLenght(key:number):number{
    if(this.m_ObjectPoolDic[key])
    {
        //對象池中存在該 key 對應的池
        let childNode=this.node.getChildByName(key.toString())
        return childNode.numChildren;
    }else
    {
        //對象池中不存在該 key 對應的池
        console.log("獲取對象錯誤,沒有 該值所對應的對象池");
        return null;
    }
}

}

使用方法:var Cube:Laya.MeshSprite3D=new Laya.MeshSprite3D(Laya.PrimitiveMesh.createBox(1, 1, 1)) as Laya.MeshSprite3D;
PoolManager.getInstance().InitPool(1,Cube); //這一步必須進行

    for (let i=0 ;i<10;i++){
        var CubeSwpan=scene.addChild( PoolManager.getInstance().DequeueItem(1)) as Laya.MeshSprite3D;
        CubeSwpan.transform.localPosition=new Laya.Vector3 (-i+5,0,-i+5);
       this. List[i]=CubeSwpan;
    }
    debugger;

    console.log(PoolManager.getInstance().GetPoolLenght(1));
    for (let i=0 ;i<10;i++){
      let Cube= this.List[i] as Laya.MeshSprite3D;
      Cube.active=false;
      PoolManager.getInstance().EnqueueItem(1,Cube);
    }
    debugger;
    console.log(PoolManager.getInstance().GetPoolLenght(1));
}
List ={key:Laya.MeshSprite3D};`


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM