Unity对象池优化
针对于上篇的对象池进行优化:
1、将字典里的对象列表改成缓存池对象
2、添加对象父类管理
3、添加场景跳转的清空对象池的方法
代码实现:
C#
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);
}
}
评论