首页 学习日记正文

Unity对象池优化

阿沐 学习日记 2020-04-03 618 0 unity

Unity对象池优化

image.png

针对于上篇的对象池进行优化:

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);
    }
}

image.png

打赏

评论

Music