优化游戏篇:Unity对象池的简单使用

这里有一篇文章,https://www.cnblogs.com/yugejuhao/p/7677497.html,这对象池还是比较简单易懂的,下面有我在项目中用到的,分享记录一下。

优化游戏篇:Unity对象池的简单使用_第1张图片

优化游戏篇:Unity对象池的简单使用_第2张图片

 

 

优化游戏篇:Unity对象池的简单使用_第3张图片

      可以自己添加一个方法,设置物体生成在哪个父节点下面 

优化游戏篇:Unity对象池的简单使用_第4张图片

这里是项目中用到的对象池 ,思想是跟上面一样的,不过使用的ET框架,可能写法会有点奇怪,不过都是一样的!

 

namespace *****
{
    ///


    ///pdk 对象池
    ///

    public class PoolManager
    {
        private static PoolManager instance;
        public static PoolManager Instance()
        {
            if (instance == null)
            {
                instance = new PoolManager();

            }
            return instance;
        }
        ///


        /// 对象池管理字典(池名,池内对象)
        ///

        Dictionary> PoolController = new Dictionary>();
        ///
        /// 获取特效
        ///

        ///
        private  GameObject GetEffect(string name,string prefab)
        {
            ETModel.Game.Scene.GetComponent().LoadBundle(name + ".unity3d");
            //实例化一个预制体
            GameObject obj = ETModel.Game.Scene.GetComponent().GetAsset(name + ".unity3d", prefab) as GameObject;
            GameObject temp = UnityEngine.MonoBehaviour.Instantiate(obj );
            return temp;
        }

        ///


        /// 获取对象
        ///

        /// bundle名字
        /// 资源名字
        ///
        public GameObject GetPool(string path,string poolName)
        {
            GameObject obj;
            GameDebug.LogYellow("PoolController+++++++++++++++"+ PoolController.Count);
            ///存在直接从池子拿
            if (PoolController.ContainsKey(poolName) && PoolController[poolName].Count > 0)
            {
                obj = PoolController[poolName][0];
                PoolController[poolName].RemoveAt(0);
            }
            ///不够用,继续克隆
            else if (PoolController.ContainsKey(poolName) && PoolController[poolName].Count <= 0)
            {
                obj = GetEffect(path, poolName);       //GameObject. Instantiate(GetEffect(path, poolName) as GameObject);
            }
            ///不存在克隆
            else
            {
                obj = GetEffect(path, poolName);       //GameObject.Instantiate(GetEffect(path, poolName)  as GameObject);
                PoolController.Add(poolName, new List() { });
            }
            ///存在,激活
            if (obj)
            {
                obj.SetActive(true);
            }

            return obj;
        }
        ///


        /// 回收
        ///

        /// 物体
        /// 名字
        public void IntoPool(GameObject obj, string name)
        {
    
            obj.transform.DOKill();          
            obj.transform.parent = UnityTool.Find("UIAssets").transform;         
            obj.SetActive(false);
            if (PoolController.ContainsKey(name))
            {
                PoolController[name].Add(obj);
            }


        }
        ///


        /// 清空对象池
        ///

        public void Clear()
        {
            PoolController.Clear();
           
        }


    }
}
我们只需要obj = PoolManager.Instance().GetPool(“路径”,“物体名字”);

你可能感兴趣的:(游戏优化,对象池)