using System.Collections.Generic; using ScrewsMaster; using UnityEngine; using UnityEngine.UI; namespace Roy.ObjectPool { public class PoolManager : SingletonMonoBehaviour { private GameObject _gameObjectParentNode; private GameObject _uiPoolParentNode; private readonly Dictionary _pools = new Dictionary(); protected override void Awake() { _gameObjectParentNode = new GameObject("GameObjectPool"); _gameObjectParentNode.transform.SetParent(transform); // 设置为对象池管理类的子节点 // 创建一个用于存放UI元素的节点 _uiPoolParentNode = new GameObject("UIPool"); _uiPoolParentNode.transform.SetParent(transform); // 设置为对象池管理类的子节点 // 添加必需的组件 var canvas = _uiPoolParentNode.AddComponent(); canvas.renderMode = RenderMode.ScreenSpaceCamera; foreach (var c in Camera.allCameras) { if (!c.name.Equals("Camera")) continue;//TODO 当前是去找固定名称的摄像机 后续看看怎么优化调整 canvas.worldCamera = c; break; } var canvasScaler = _uiPoolParentNode.AddComponent(); // 添加适配组件 canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize; canvasScaler.referenceResolution = new Vector2(Screen.width, Screen.height); _uiPoolParentNode.AddComponent(); // 添加事件处理组件 base.Awake(); } // 创建对象池 public void CreatePool(string poolName, T prefab, int initialSize, bool isUI = false) where T : ObjectPoolItem { if (!_pools.ContainsKey(poolName)) { var poolGameObject = new GameObject(poolName); if (isUI) { poolGameObject.AddComponent(); poolGameObject.SetParent(_uiPoolParentNode); } else { poolGameObject.SetParent(_gameObjectParentNode); } ObjectPool pool = new ObjectPool(poolName, prefab, initialSize, poolGameObject.transform); _pools.Add(poolName, pool); } else { Debug.LogError($"尝试创建已经存在的的对象池,请检查 !!!"); } } // 获取对象 public T GetObject(string poolName) where T : ObjectPoolItem { if (_pools.TryGetValue(poolName, out var pool)) { return ((ObjectPool)pool).Get(); } else { Debug.LogError($"尝试获取没有初始化的对象池,请检查!!!!"); return null; } } // 判断是否存在名称为 poolName 的对象池 public bool HasPool(string poolName) { return _pools.ContainsKey(poolName); } // 归还对象 public void ReturnObject(string poolName, T obj) where T : ObjectPoolItem { if (_pools.TryGetValue(poolName, out var pool)) { ((ObjectPool)pool).ReturnToPool(obj); } else { Destroy(obj.gameObject); Debug.LogError($"归还了不存在对象池 {poolName} 的对象"); } } // 清空指定池 public void ClearPool(string poolName) { if (_pools.TryGetValue(poolName, out var pool)) { ((ObjectPool)pool).ClearPool(); _pools.Remove(poolName); // 清空后移除池 } else { Debug.LogError($"尝试清空不存在的对象池,请检查!!!"); } } } }