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

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

 

 

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

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

 

namespace *****
{
    /// <summary>
    ///pdk 对象池
    /// </summary>
    public class PoolManager
    {
        private static PoolManager instance;
        public static PoolManager Instance()
        {
            if (instance == null)
            {
                instance = new PoolManager();

            }
            return instance;
        }
        /// <summary>
        /// 对象池管理字典(池名,池内对象)
        /// </summary>
        Dictionary<string, List<GameObject>> PoolController = new Dictionary<string, List<GameObject>>();
        /// <summary>
        /// 获取特效
        /// </summary>
        /// <returns></returns>
        private  GameObject GetEffect(string name,string prefab)
        {
            ETModel.Game.Scene.GetComponent<ResourcesComponent>().LoadBundle(name + ".unity3d");
            //实例化一个预制体
            GameObject obj = ETModel.Game.Scene.GetComponent<ResourcesComponent>().GetAsset(name + ".unity3d", prefab) as GameObject;
            GameObject temp = UnityEngine.MonoBehaviour.Instantiate(obj );
            return temp;
        }

        /// <summary>
        /// 获取对象
        /// </summary>
        /// <param name="path">bundle名字</param>
        /// <param name="poolName">资源名字</param>
        /// <returns></returns>
        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<GameObject>() { });
            }
            ///存在,激活
            if (obj)
            {
                obj.SetActive(true);
            }

            return obj;
        }
        /// <summary>
        /// 回收
        /// </summary>
        /// <param name="obj">物体</param>
        /// <param name="name">名字</param>
        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);
            }


        }
        /// <summary>
        /// 清空对象池
        /// </summary>
        public void Clear()
        {
            PoolController.Clear();
           
        }


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值