unity 之简单的实例(clone)对象池
using System; using System.Collections.Generic; using UnityEngine; public class GameObjectPoolEntity { public Queue<GameObject> QueueList; public string Name; public GameObject Pool0bj; } public class QGGameObjectPool : IDisposable { private Dictionary<int, GameObjectPoolEntity> m_PoolDic; private Dictionary<int, List<int>> m_InstanceIdDic; public QGGameObjectPool() { m_PoolDic = new Dictionary<int, GameObjectPoolEntity>(); m_InstanceIdDic = new Dictionary<int, List<int>>(); } //取池 public GameObject Spawn(GameObject prefabObj, Action<GameObject> onComplete = null) { lock (m_PoolDic) { int instanceId = prefabObj.GetInstanceID(); m_PoolDic.TryGetValue(instanceId, out var poolEntity); if (poolEntity == null) { poolEntity = new() { Pool0bj = new GameObject(prefabObj.name + "Pool"), Name = prefabObj.name, QueueList = new Queue<GameObject>() }; m_PoolDic[instanceId] = poolEntity; } else { if (poolEntity.QueueList.Count > 0) { GameObject obj = poolEntity.QueueList.Dequeue(); obj.SetActive(true); onComplete?.Invoke(obj); return obj; } } GameObject newObj = GameObject.Instantiate(prefabObj); newObj.transform.parent = poolEntity.Pool0bj.transform; m_InstanceIdDic.TryGetValue(instanceId, out var lst); lst??= new List<int>(); lst.Add(newObj.GetInstanceID()); m_InstanceIdDic[instanceId] = lst; newObj.SetActive(true); onComplete?.Invoke(newObj); return newObj; } } //回池 public void Despawn(GameObject gameObject) { lock (m_PoolDic) { int instanceId = GetInstanceId(gameObject.GetInstanceID()); m_PoolDic.TryGetValue(instanceId, out var poolEntity); if (poolEntity != null) { gameObject.SetActive(false); poolEntity.QueueList.Enqueue(gameObject); } } } private int GetInstanceId(int instanceID) { foreach (var item in m_InstanceIdDic) { foreach (var obj in item.Value) { if (obj == instanceID) { return item.Key; } } } return 0; } public void Dispose() { m_PoolDic.Clear(); m_InstanceIdDic.Clear(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2022-05-04 C# 之List底层源码解析
2022-05-04 unity之通用FSM有限状态机 —>流程管理的使用(二)