Unity对象池的实现
对象池是一个单例类:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ObjectPool { private static ObjectPool instance; private ObjectPool() { pool = new Dictionary<string, List<GameObject>>(); prefabs = new Dictionary<string, GameObject>(); } public static ObjectPool GetInstance() { if (instance==null) { instance = new ObjectPool(); } return instance; } /// <summary> /// 对象池 /// </summary> private Dictionary<string,List<GameObject>> pool; /// <summary> /// 预设体 /// </summary> private Dictionary<string, GameObject> prefabs; /// <summary> /// 从对象池中获取对象 /// </summary> /// <param name="objName"></param> /// <returns></returns> public GameObject GetObj(string objName) { //结果对象 GameObject result=null; //判断是否有该名字的对象池 if (pool.ContainsKey(objName)) { //对象池里有对象 if (pool[objName].Count>0) { //获取结果 result = pool[objName][0]; //激活对象 result.SetActive(true); //从池中移除该对象 pool[objName].Remove(result); //返回结果 return result; } } //如果没有该名字的对象池或者该名字对象池没有对象 GameObject prefab = null; //如果已经加载过该预设体 if (prefabs.ContainsKey(objName)) { prefab = prefabs[objName]; } else //如果没有加载过该预设体 { //加载预设体 prefab = Resources.Load<GameObject>("Prefabs/"+objName); //更新字典 prefabs.Add(objName, prefab); } //生成 result = UnityEngine.Object.Instantiate(prefab); //改名(去除 Clone) result.name = objName; //返回 return result; } /// <summary> /// 回收对象到对象池 /// </summary> /// <param name="objName"></param> public void RecycleObj(GameObject obj) { //设置为非激活 obj.SetActive(false); //判断是否有该对象的对象池 if (pool.ContainsKey(obj.name)) { //放置到该对象池 pool[obj.name].Add(obj); } else { //创建该类型的池子,并将对象放入 pool.Add(obj.name, new List<GameObject>() { obj }); } } }
以后要生成对象就获取单例通过GetObj()来获取,对象回收就调用RecycleObj(),这样就减少了生成和销毁预制体的性能消耗
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】