Unity对象池(简单)

Unity对象池(简单) 什么是对象池在游戏开发中对象池Object Pool 是一种用于优化性能的设计模式主要用于高效管理和复用那些需要频繁创建和销毁的游戏对象如子弹、敌人、特效等。核心原理传统方式中游戏对象的 “创建Instantiate” 和 “销毁Destroy” 操作会产生较高的性能开销尤其是频繁执行时。对象池的思路是预先创建一批对象将其 “闲置” 在池中当需要使用对象时从池中 “取出”激活当对象不再需要时不直接销毁而是 “放回” 池中禁用等待下次复用。优点1.减少性能消耗避免频繁创建 / 销毁对象导致的内存碎片和 CPU 开销。2.稳定帧率尤其在高频率生成对象的场景如弹幕游戏、大量敌人刷新中能有效防止帧率波动。3.逻辑集中化对象的生命周期由池统一管理便于维护和扩展。典型应用场景频繁生成的子弹、技能特效大量刷新的敌人、NPC场景中重复出现的道具、互动元素。代码块初始化对象池为每种预制体创建一个空列表从0开始不预创建对象privatevoidAwake(){// 确保最大数量数组与预制体数组长度一致if(maxCounts.Length!prefabs.Length){Debug.LogError(maxCounts数组长度必须与prefabs数组一致);return;}// 初始化对象池为每种预制体创建一个空列表从0开始不预创建对象poolsnewListGameObject[prefabs.Length];for(inti0;ipools.Length;i){pools[i]newListGameObject();// 初始为空列表}}用于从对象池获取一个可用对象优先复用闲置对象必要时创建新对象publicGameObjectGet(inti){// 1. 优先查找失活对象复用foreach(GameObjectiteminpools[i]){if(!item.activeSelf){item.SetActive(true);// 激活对象returnitem;}}// 2. 若没有失活对象检查是否可新生成未达最大数量if(pools[i].CountmaxCounts[i]){// 生成新对象并加入对象池GameObjectnewObjInstantiate(prefabs[i],transform);pools[i].Add(newObj);returnnewObj;}// 3. 已达最大数量且无失活对象返回null或根据需求处理returnnull;}回收对象到池设为失活状态供下次复用publicvoidRecycle(inti,GameObjectobj){// 校验索引和对象合法性if(i0||ipools.Length||!pools[i].Contains(obj)){Debug.LogError(回收失败对象不属于目标对象池);return;}obj.SetActive(false);// 设为失活状态// 可选重置对象状态位置、旋转等obj.transform.positionVector3.zero;obj.transform.rotationQuaternion.identity;}完整代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassPoolManager:MonoBehaviour{publicGameObject[]prefabs;// 预制要管理的预制体数组publicint[]maxCounts;// 每个预制体的最大生成数量与prefabs索引对应ListGameObject[]pools;// 存储不同类型对象的列表数组privatevoidAwake(){// 确保最大数量数组与预制体数组长度一致if(maxCounts.Length!prefabs.Length){Debug.LogError(maxCounts数组长度必须与prefabs数组一致);return;}//--------------------------------------------------------------------------------------------------// 初始化对象池为每种预制体创建一个空列表从0开始不预创建对象poolsnewListGameObject[prefabs.Length];for(inti0;ipools.Length;i){pools[i]newListGameObject();// 初始为空列表}//--------------------------------------------------------------------------------------------------}/// summary/// 用于从对象池获取一个可用对象优先复用闲置对象必要时创建新对象。/// /summarypublicGameObjectGet(inti){// 1. 优先查找失活对象复用foreach(GameObjectiteminpools[i]){if(!item.activeSelf){item.SetActive(true);// 激活对象returnitem;}}// 2. 若没有失活对象检查是否可新生成未达最大数量if(pools[i].CountmaxCounts[i]){// 生成新对象并加入对象池GameObjectnewObjInstantiate(prefabs[i],transform);pools[i].Add(newObj);returnnewObj;}// 3. 已达最大数量且无失活对象返回null或根据需求处理Debug.LogWarning($预制体[{i}]已达最大数量{maxCounts[i]}无法生成新对象);returnnull;}/// summary/// 回收对象到池设为失活状态供下次复用/// /summarypublicvoidRecycle(inti,GameObjectobj){obj.SetActive(false);// 设为失活状态// 可选重置对象状态位置、旋转等obj.transform.positionVector3.zero;obj.transform.rotationQuaternion.identity;}}