Files
2026-07-13 18:14:23 +08:00

117 lines
4.1 KiB
C#

using System.Collections.Generic;
using ScrewsMaster;
using UnityEngine;
using UnityEngine.UI;
namespace Roy.ObjectPool
{
public class PoolManager : SingletonMonoBehaviour<PoolManager>
{
private GameObject _gameObjectParentNode;
private GameObject _uiPoolParentNode;
private readonly Dictionary<string, object> _pools = new Dictionary<string, object>();
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>();
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>(); // 添加适配组件
canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
canvasScaler.referenceResolution = new Vector2(Screen.width, Screen.height);
_uiPoolParentNode.AddComponent<GraphicRaycaster>(); // 添加事件处理组件
base.Awake();
}
// 创建对象池
public void CreatePool<T>(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<RectTransform>();
poolGameObject.SetParent(_uiPoolParentNode);
}
else
{
poolGameObject.SetParent(_gameObjectParentNode);
}
ObjectPool<T> pool = new ObjectPool<T>(poolName, prefab, initialSize, poolGameObject.transform);
_pools.Add(poolName, pool);
}
else
{
Debug.LogError($"尝试创建已经存在的的对象池,请检查 !!!");
}
}
// 获取对象
public T GetObject<T>(string poolName) where T : ObjectPoolItem
{
if (_pools.TryGetValue(poolName, out var pool))
{
return ((ObjectPool<T>)pool).Get();
}
else
{
Debug.LogError($"尝试获取没有初始化的对象池,请检查!!!!");
return null;
}
}
// 判断是否存在名称为 poolName 的对象池
public bool HasPool(string poolName)
{
return _pools.ContainsKey(poolName);
}
// 归还对象
public void ReturnObject<T>(string poolName, T obj) where T : ObjectPoolItem
{
if (_pools.TryGetValue(poolName, out var pool))
{
((ObjectPool<T>)pool).ReturnToPool(obj);
}
else
{
Destroy(obj.gameObject);
Debug.LogError($"归还了不存在对象池 {poolName} 的对象");
}
}
// 清空指定池
public void ClearPool(string poolName)
{
if (_pools.TryGetValue(poolName, out var pool))
{
((ObjectPool<ObjectPoolItem>)pool).ClearPool();
_pools.Remove(poolName); // 清空后移除池
}
else
{
Debug.LogError($"尝试清空不存在的对象池,请检查!!!");
}
}
}
}