美文网首页
简单对象池的实现(多种GameObject)

简单对象池的实现(多种GameObject)

作者: OneMore2018 | 来源:发表于2017-09-18 15:15 被阅读8次

    之前做的一个项目,需要很频繁的生成多种不同模型,所以我就把之前单一对象池修改了下,可以使用多种GameObject~~。 废话不多说,上代码 

    ObjectPool类

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class ObjectPool

    {

    private ListdespawnedTrans;

    public AnimalTransformInfo origianTran;

    public Transform prefab;

    public Transform root;

    public int curTranCount = 0;

    public int TranCount

    {

    get

    {

    return curTranCount;

    }

    }

    public ObjectPool(Transform _prefab, Transform _root)    

    {       

     despawnedTrans = new List();

    origianTran = new AnimalTransformInfo();

    prefab = _prefab;

    root = _root;

    prefab.SetParent(root);

    prefab.gameObject.SetActive(false);

    }

    public int DespawnedCout

    {

    get

    {

    return despawnedTrans.Count;

    }

    }

    ////// 从池中取出一个对象

    //////

    public Transform Spwan()    {       

     if(despawnedTrans.Count == 0)        {           

     CreateInstance();        }        

    Transform tran = despawnedTrans[0];        

    origianTran.initPos = tran.position;        

    origianTran.initRoate = tran.rotation;        

    origianTran.initScale = tran.localScale;        

    despawnedTrans.RemoveAt(0);        

    tran.gameObject.SetActive(true);        

    return tran;    

    }

    public void DeSpawn(Transform tran, bool parentChange = true)

    {

    if(despawnedTrans.Contains(tran))

    {

    return;

    }

    if(parentChange)

    {

    tran.SetParent(root);

    }

    tran.position = origianTran.initPos;

    tran.rotation = origianTran.initRoate;

    tran.localScale = origianTran.initScale;

    despawnedTrans.Add(tran);

    tran.gameObject.SetActive(false);

    }

    ///

    /// 创建新的一个对象

    ///

    public void CreateInstance()

    {

    GameObject obj = GameObject.Instantiate(prefab.gameObject);

    obj.transform.SetParent(root);

    despawnedTrans.Add(obj.transform);

    obj.name = prefab.name;

    // obj.name = string.Concat(prefab.name, curTranCount++);  修改名字

    }

    ///

    /// 在池中一次创建多个新的对象

    /////

    public IEnumerator CreateInstances(int count)

    {

    for(int i =0;i < count;i++)

    {

    CreateInstance();

    yield return null;

    }

    }

    ///

    /// 释放池

    ///

    public void Dispose()

    {

    curTranCount = 0;

    despawnedTrans.ForEach(delegate (Transform tran)

    {

    if(tran != null)

    {

    GameObject.Destroy(tran.gameObject);

    }

    });

    if(prefab != null)

    {

    GameObject.Destroy(prefab.gameObject);

    }

    despawnedTrans = null;

    }

    }

    接下来是创建不同的池,使用ItemCreator类

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    public class ItemCreator {    

    public DictionarybasePools;    

    private Transform poolRoot;      

     public ItemCreator()    {      

      basePools = new Dictionary();

    poolRoot = new GameObject("PoolRoot").transform;

    MonoBehaviour.DontDestroyOnLoad(poolRoot.gameObject);

    }

    ////

    // 创建一个对象池

    //////

    public void AddPool(GameObject prefabObj)

    {

    AddPool(prefabObj.name, prefabObj, poolRoot);

    }

    //创建一个池对象并添加到Dic中

    public void AddPool(string prefabName ,GameObject prefabObj ,Transform root)

    {

    if(basePools.ContainsKey(prefabName))

    {

    return;

    }

    ObjectPool prefabPool = new ObjectPool(prefabObj.transform, root);

    basePools.Add(prefabName, prefabPool);

    }

    //从一个池中取出一个对象

    public Transform SpawnObjByName(string name )    {      

      if(!basePools.ContainsKey(name))        {                     

     GameObject newPoolObj = MonoBehaviour.Instantiate(Resources.Load("model/"+name));

    newPoolObj.name = name;

    AddPool(newPoolObj);

    return basePools[name].Spwan();

    }

    return basePools[name].Spwan();

    }

    //将对象还给池

    public void DeSpawn(string nam, Transform tran, bool parentChange =true)

    {

    if(!basePools.ContainsKey(nam))

    {

    return;

    }

    basePools[nam].DeSpawn(tran,parentChange);

    }

    到此为止,生成的时候调用这个管理类来生成就行了,释放也是一样的~~

    相关文章

      网友评论

          本文标题:简单对象池的实现(多种GameObject)

          本文链接:https://www.haomeiwen.com/subject/splbsxtx.html