概述
知识点
Dictionary,List,GameObject
作用
节约性能,减少cpu和内存消耗
缓存对象在层级窗口的结构
池子容器类—PoolData.cs
/// <summary>
/// 池子数据
/// </summary>
public class PoolData
{
//池子中存储对象的父对象,当对用不使用时 会做为该对象的子对象(目的是让层级面板看起来不那么乱)
private GameObject root;
//池子列表容器,用于存储不用的对象
private List<GameObject> listObjs;
/// <summary>
/// 初始化单一池子 将池子父对象传入 新建一个对象作为它的子对象
/// </summary>
/// <param name="str"></param>
public PoolData(GameObject poolRoot, string str)
{
//新建一个池子父对象
root = new GameObject(str);
//将它的父对象设置为 池子跟对象
root.transform.SetParent(poolRoot.transform);
//新建容器
listObjs = new List<GameObject>();
}
/// <summary>
/// 是否存在对象
/// </summary>
public bool IsHave
{
get
{
return listObjs.Count > 0;
}
}
/// <summary>
/// 从对象列表中取出对象
/// </summary>
/// <returns></returns>
public GameObject Pop()
{
//取出第一个对象
GameObject obj = listObjs[0];
//并且从存储他的容器中取出去
listObjs.RemoveAt(0);
//激活它
obj.SetActive(true);
//解出父子关系
obj.transform.SetParent(null);
return obj;
}
/// <summary>
/// 向列表中压入对象
/// </summary>
/// <param name="obj"></param>
public void Push(GameObject obj)
{
//设置失活
obj.SetActive(false);
//将其放到池子父对象下
obj.transform.SetParent(root.transform);
//记录它
listObjs.Add(obj);
}
}
池子管理类—PoolMgr.cs
/// <summary>
/// 缓存池管理器
/// </summary>
public class PoolMgr : BaseManager<PoolMgr>
{
//池子根容器对象
private GameObject root = null;
//池子数据容器 key作为池子名 value作为池子中的数据
private Dictionary<string, PoolData> poolDic = new Dictionary<string, PoolData>();
/// <summary>
/// 压入缓存池
/// </summary>
public void Push(string poolName, GameObject obj)
{
//如果没有池子跟对象 新建一个 (目的让层级窗口不乱)
if (root == null)
root = new GameObject("Pool");
//有池子 直接往里面压
if ( poolDic.ContainsKey(poolName) )
poolDic[poolName].Push(obj);
//没有池子
else
{
//新建一个池子数据类
PoolData data = new PoolData(root, poolName);
//将子对象压入 会跳转到PoolData的Push方法
data.Push(obj);
//将数据存到数据容器字典中
poolDic.Add(poolName, data);
}
}
/// <summary>
/// 弹出对象
/// </summary>
/// <param name="poolName">对象池子名</param>
/// <param name="LoadOver">加载出来后用来做什么的回调函数</param>
public void Pop(string poolName, Action<object> LoadOver = null)
{
GameObject obj = null;
//池中存在
if (poolDic.ContainsKey(poolName) && poolDic[poolName].IsHave)
{
//直接跳转到PoolData的Pop方法
obj = poolDic[poolName].Pop();
//因为采用的异步加载 这里已经有对象 不用加载 直接调用回调
if(LoadOver != null)
LoadOver(obj);
}
//池中不存在 异步加载资源 请查看Resources资源加载模块
else
ResourcesMgr.Instance.LoadRes(poolName, LoadOver);
}
/// <summary>
/// 清除缓存池 一般会在加载场景时清空 因为过场景 缓存池对象一般会全部清空
/// </summary>
public void Clear()
{
//跟对象置空
root = null;
//容器清理
poolDic.Clear();
}
}
最后
以上就是霸气月饼为你收集整理的[Unity3D——用代码说明一切] 基础模块:缓存池的全部内容,希望文章能够帮你解决[Unity3D——用代码说明一切] 基础模块:缓存池所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复