首页 学习日记正文

Unity对象池继续优化【资源加载方式改为异步】

阿沐 学习日记 2020-04-10 837 0 unity

Unity对象池继续优化【资源加载方式改为异步】

image.png

1、优化点:

    a、资源加载方式改为异步

    b、添加资源加载完成的回调函数

    c、对象池数据类获取对象方法添加设置父对象

2、具体实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

/// <summary>
/// 对象池  缓存池
/// </summary>

public class PoolManager : SingletonBase<PoolManager> {

    //对象池 类型名字/类型列表
    public Dictionary<string, PoolData> poolDict = new Dictionary<string, PoolData>();
    //对象池 父类对象
    public GameObject poolParentObj;
    //游戏物体 父类
    public GameObject thingParentObj;

    public void GetObj(string name,UnityAction<GameObject> callBack=null)
    {
        if (thingParentObj == null)
            thingParentObj = new GameObject("Things");
        if (poolDict.ContainsKey(name) && poolDict[name].poolList.Count>0)
        {
            GameObject obj = poolDict[name].GetObj(thingParentObj);
            if(callBack!=null)
                callBack(obj);
        }
        else
        {
            ////对象池里没有对象时,实例化生成该对象
            //通过异步加载 创建对象给外部使用
            ResController.GetInstance().LoadAssetAsync<GameObject>(name, (o) =>
            {
                o.name = name;
                o.transform.parent = thingParentObj.transform;//设置游戏父类对象
                o.SetActive(true);//显示对象
                if(callBack!=null)
                    callBack(o);
            });
        }
    }

    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 parentObj)
    {
        GameObject obj = poolList[0];//取出第一个
        poolList.RemoveAt(0);//列表移除
        obj.transform.parent = parentObj.transform;//设置父对象
        obj.SetActive(true);//设置对象显示
        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);
    }
}

测试:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameStart : MonoBehaviour {

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            PoolManager.GetInstance().GetObj("Pool/Cube", (obj) => {
                obj.transform.localScale = Vector3.one * 2;
            });//获得对象,生成显示
           
        }
        if (Input.GetMouseButtonDown(1))
        {
            PoolManager.GetInstance().GetObj("Pool/Cube2");
        }


    }
}


打赏

评论

Music