简单实现对象池

来源:互联网 发布:potplayermini优化版 编辑:程序博客网 时间:2024/06/04 17:44

对象池的关键代码:

public class ObjectPoolManager{    //  多一对象池    private Dictionary<string, List<GameObject>> dicPools;    //      #region 单例    private static ObjectPoolManager instance;    public static ObjectPoolManager Instance    {        get        {            if (instance == null)            {                instance = new ObjectPoolManager();            }            return instance;        }    }    private ObjectPoolManager()    {        dicPools = new Dictionary<string, List<GameObject>>();    }    #endregion    //  从对象池中实例化物体    public GameObject Instanciate(GameObject prefab)    {        GameObject result;        //  根据prefab.name判断对象池里是否有该游戏对象,并且个数大于零        if (dicPools.ContainsKey(prefab.name) && dicPools[prefab.name].Count > 0)        {            result = dicPools[prefab.name][0];            dicPools[prefab.name].Remove(dicPools[prefab.name][0]);            result.SetActive(true);            return result;        }        else        {            //  最开始执行一定是先执行下面的代码,设定好对象池中游戏的名字            result = MonoBehaviour.Instantiate(prefab) as GameObject;            result.name = prefab.name;            return result;        }    }    //  将消失的物体放回对象池    public void DestroyObj(GameObject prefab)    {        prefab.SetActive(false);        if (!dicPools.ContainsKey(prefab.name))        {            dicPools[prefab.name] = new List<GameObject>();        }        dicPools[prefab.name].Add(prefab);    }}
挂载在对象池游戏对象上:

public class CubeDestroy : MonoBehaviour{    void OnEnable()    {        StartCoroutine("MyDestroy");    }    IEnumerator MyDestroy()    {        yield return new WaitForSeconds(2);        ObjectPoolManager.Instance.DestroyObj(gameObject);    }}

测试代码:

public class GameCtrl : MonoBehaviour{    public GameObject cubePrefab;    public GameObject spherePrefab;    void Update()    {        if (Input.GetMouseButtonDown(0))        {            ObjectPoolManager.Instance.Instanciate(cubePrefab);        }        if (Input.GetMouseButtonDown(1))        {            ObjectPoolManager.Instance.Instanciate(spherePrefab);        }    }}



原创粉丝点击