美文网首页
游戏 对象池

游戏 对象池

作者: BugUnknown | 来源:发表于2018-08-25 17:34 被阅读46次
    对象池思路.png
    • 代码实现
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;
    
    public class ObjectPool
    {
        #region 单例
    
        private static ObjectPool instance;
    
        public static ObjectPool GetInstance(string resPath="")
        {
            if (instance==null)
            {
                if (resPath != null)
                {
                    instance = new ObjectPool(resPath);
                }
                else
                {
                    instance = new ObjectPool();
                }
            }
    
            instance.UpdateResourcePath(resPath);    
    
            return instance;
        }
    
        /// <summary>
        /// 构造方法
        /// </summary>
        public ObjectPool()
        {
            prefabs = new Dictionary<string, GameObject>();
            pools = new Dictionary<string, List<GameObject>>();
        }
    
        /// <summary>
        /// 构造方法
        /// </summary>
        /// <param name="resPath"></param>
        public ObjectPool(string resPath)
        {
            resourcePath = resPath;
            prefabs = new Dictionary<string, GameObject>();
            pools = new Dictionary<string, List<GameObject>>();
        }
    
        #endregion
    
    
        #region 对象预设体资源管理
    
        //资源加载路径
        private string resourcePath;
        //所有预设体
        private Dictionary<string, GameObject> prefabs;
    
        public GameObject GetPrefab(string prefabName)
        {
            if (prefabs.ContainsKey(prefabName))
            {
                //返回
                return prefabs[prefabName];
            }
            else
            {
                //添加新的预设体
                return LoadPrefab((prefabName));
            }
        }
    
        /// <summary>
        /// 加载预设体
        /// </summary>
        /// <param name="prefabName"></param>
        /// <returns></returns>
        public GameObject LoadPrefab(string prefabName)
        {
            string path = "";
            if (resourcePath!= "")
            {
                path += resourcePath;
            }
            GameObject obj = Resources.Load<GameObject>(path + prefabName);
            //异常处理
            if (obj != null)
            {
                //放到字典
                prefabs.Add(prefabName, obj);
            }
            //返回
            return obj;
        }
    
        /// <summary>
        /// 更新预设体加载路径
        /// </summary>
        /// <param name="resPath"></param>
        public void UpdateResourcePath(string resPath)
        {
            resourcePath = resPath;
        }
    
        #endregion
    
        #region 对象池
    
        private Dictionary<string, List<GameObject>> pools;
    
        /// <summary>
        /// 回收对象
        /// </summary>
        /// <param name="obj"></param>
        public void RecycleObject(GameObject obj)
        {
            //非激活
            obj.SetActive(false);
            //获取对象的名称
            string objName = obj.name.Replace("(Clone)", "");
            //判断有无该类对象池
            if(!pools.ContainsKey(objName))
            {
                //实例化子池
                pools.Add(objName, new List<GameObject>());
            }
            //添加到池子
            pools[objName].Add(obj);
        }
    
        public GameObject SpawnObject(string objName,Action<GameObject> poolEvent=null)
        {
            //输出结果
            GameObject result = null;
    
            //池中有货
            if (pools.ContainsKey(objName)&&pools[objName].Count>0)
            {
                //结果
                result = pools[objName][0];
                //移除
                pools[objName].Remove(result);
            }
            else
            {
                //拿到预设体
                GameObject prefab = GetPrefab(objName);
                if (prefab!=null)
                {
                   result = GameObject.Instantiate(prefab);
                }
            }
    
            //激活
            result.SetActive(true);
    
            //执行事件
            if (result && poolEvent != null)
            {
                poolEvent(result);
            }
    
            //返回结果
            return result;
        }
    
        #endregion
    }
    
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Bullet : MonoBehaviour
    {
        void OnEnable()
        {
            StartCoroutine(AutoRecycle());
        }
    
        IEnumerator AutoRecycle()
        {
            yield return new WaitForSeconds(2f);
    
            //回收
            ObjectPool.GetInstance().RecycleObject(gameObject);
        }
    }
    
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PoolDemo : MonoBehaviour
    {
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                ObjectPool.GetInstance("Prefabs/").SpawnObject("Cube", (o) =>  
                {
                    o.transform.position = new Vector3
                    (
                        Random.Range(-5,5f),
                        Random.Range(-5, 5f),
                        Random.Range(-5, 5f)
                    );
                });
            }
        }
    }
    
    对象池效果图.gif

    相关文章

      网友评论

          本文标题:游戏 对象池

          本文链接:https://www.haomeiwen.com/subject/gxrdiftx.html