[Unity3D——用代码说明一切] 基础模块:缓存池

知识点
    Dictionary,List,GameObject

作用
    节约性能,减少cpu和内存消耗

缓存对象在层级窗口的结构
     [Unity3D——用代码说明一切] 基础模块:缓存池_第1张图片

池子容器类—PoolData.cs

/// 
/// 池子数据
/// 
public class PoolData
{
    //池子中存储对象的父对象,当对用不使用时 会做为该对象的子对象(目的是让层级面板看起来不那么乱)
    private GameObject root;
    //池子列表容器,用于存储不用的对象
    private List listObjs;

    /// 
    /// 初始化单一池子 将池子父对象传入 新建一个对象作为它的子对象
    /// 
    /// 
    public PoolData(GameObject poolRoot, string str)
    {
        //新建一个池子父对象
        root = new GameObject(str);
        //将它的父对象设置为 池子跟对象
        root.transform.SetParent(poolRoot.transform);
        //新建容器
        listObjs = new List();
    }

    /// 
    /// 是否存在对象
    /// 
    public bool IsHave
    {
        get
        {
            return listObjs.Count > 0;
        }
    }

    /// 
    /// 从对象列表中取出对象
    /// 
    /// 
    public GameObject Pop()
    {
        //取出第一个对象
        GameObject obj = listObjs[0];
        //并且从存储他的容器中取出去
        listObjs.RemoveAt(0);
        //激活它
        obj.SetActive(true);
        //解出父子关系
        obj.transform.SetParent(null);
        return obj;
    }

    /// 
    /// 向列表中压入对象
    /// 
    /// 
    public void Push(GameObject obj)
    {
        //设置失活
        obj.SetActive(false);
        //将其放到池子父对象下
        obj.transform.SetParent(root.transform);
        //记录它
        listObjs.Add(obj);
    }
}

池子管理类—PoolMgr.cs

/// 
/// 缓存池管理器
/// 
public class PoolMgr : BaseManager
{
    //池子根容器对象
    private GameObject root = null;
    //池子数据容器 key作为池子名 value作为池子中的数据
    private Dictionary poolDic = new Dictionary();

    /// 
    /// 压入缓存池
    /// 
    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);
        }
    }

    /// 
    /// 弹出对象
    /// 
    /// 对象池子名
    /// 加载出来后用来做什么的回调函数
    public void Pop(string poolName, Action 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);
    }

    /// 
    /// 清除缓存池 一般会在加载场景时清空 因为过场景 缓存池对象一般会全部清空
    /// 
    public void Clear()
    {
        //跟对象置空
        root = null;
        //容器清理
        poolDic.Clear();
    }
} 
  

 

你可能感兴趣的:(C#,Unity3D,游戏开发)