Unity对象池优化
针对于上篇的对象池进行优化:
1、将字典里的对象列表改成缓存池对象
2、添加对象父类管理
3、添加场景跳转的清空对象池的方法
代码实现:
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 对象池 缓存池 /// </summary> public class PoolManager : SingletonBase<PoolManager> { //对象池 类型名字/类型列表 public Dictionary<string, PoolData> poolDict = new Dictionary<string, PoolData>(); //对象池 父类对象 public GameObject poolParentObj; //游戏物体 父类 public GameObject thingParentObj; public GameObject GetObj(string name) { if (thingParentObj == null) thingParentObj = new GameObject("Things"); GameObject obj = null; if (poolDict.ContainsKey(name) && poolDict[name].poolList.Count>0) { obj=poolDict[name].GetObj();//取出对象 } else { obj = GameObject.Instantiate(Resources.Load<GameObject>(name));//对象池里没有对象时,实例化生成该对象 obj.name = name;//把对象的名字改成预制体的名字 } obj.transform.parent = thingParentObj.transform;//设置游戏父类对象 obj.SetActive(true);//显示对象 return obj; } public void PushObj(string name, GameObject obj) { if (poolParentObj == null) poolParentObj = new GameObject("Pool"); if (poolDict.ContainsKey(name)) { poolDict[name].PushObj(obj,poolParentObj);//对象池里有该类型列表,直接在该列表添加 } else { poolDict.Add(name, new PoolData(name,obj,poolParentObj));//对象池里没有该类型列表 } } /// <summary> /// 清空对象池、格式化 /// 主要用于场景跳转,需要重置数据 /// </summary> public void Clear() { poolDict.Clear(); poolParentObj = null; thingParentObj = null; } } /// <summary> /// 对象池 数据类 /// </summary> public class PoolData { //抽屉列表 public List<GameObject> poolList; //抽屉名称 public string poolName; public PoolData(string name,GameObject obj,GameObject parObj) { poolList = new List<GameObject>();//实例化 该类型的对象列表 poolName = name;//保存 列表名字 obj.transform.parent = parObj.transform;//设置父对象 obj.SetActive(false);//设置不显示 } /// <summary> /// 从抽屉里 获得 衣服对象[默认取出第一个] /// </summary> /// <returns></returns> public GameObject GetObj() { GameObject obj = poolList[0];//取出第一个 poolList.RemoveAt(0);//列表移除 return obj; } /// <summary> /// 将要回收的对象 添加至 对象池列表 /// </summary> /// <param name="obj">目标对象</param> /// <param name="poolParentObj">父类对象</param> public void PushObj(GameObject obj,GameObject poolParentObj) { obj.transform.parent = poolParentObj.transform; obj.SetActive(false); poolList.Add(obj); } }
评论