Unity3D 对象池 静态预制件与动态单体
效果整体思路静态预制件对象池对象池接口对象池接口继承类 动态单体对象池游戏里为了利用内存资源一般对象池是用的比较多 这里总结了两版对象池.
请结合范例工程阅读: GITHUB 地址
效果
简易弹道射击DEMO,弹道与目标均以用对象池处理
整体思路
对实例对象进行生命周期管理(GameObject显隐)
池对象的新增生命周期为 初始化(Init) , 生成(Spawn)与回收(Recycle)
静态预制件对象池
ID/池对象–池实例
针对提前定义好的预制件使用的对象池(建议与枚举绑定使用)
需要对预制件进行注册,使用Dictionary<T,ItemPoolInfo> 对所有注册的对象以及实例进行管理
ObjectPoolManager<T, Y>. Register(T identity, Y registerItem, int poolStartAmount); //注册ObjectPoolManager<T, Y>.Spawn(T identity, Transform toTrans, Vector3 toPos, Quaternion rot);//生成ObjectPoolManager<T, Y>.Recycle(T identity, Y obj);//池控制回收
对象池接口
public interface IObjectPoolStaticBase<T>{void OnPoolInit(T identity,Action<T,MonoBehaviour> OnRecycle);//实例初始化时初始化(调用OnRecycle进行回收)void OnPoolSpawn();//实例被生成时调用void OnPoolRecycle();//实例被回收时调用}
对象池接口继承类
public class CObjectPoolStaticPrefabBase<T> :MonoBehaviour,IObjectPoolStaticBase<T>{public bool m_PoolItemInited {get; private set; }public T m_Identity {get; private set; }private Action<T,MonoBehaviour> OnSelfRecycle;public virtual void OnPoolInit(T _identity,Action<T,MonoBehaviour> _OnSelfRecycle){m_Identity = _identity;m_PoolItemInited = true;OnSelfRecycle = _OnSelfRecycle;}public virtual void OnPoolSpawn() {}public virtual void OnPoolRecycle() {}public void DoRecycle() => OnSelfRecycle?.Invoke(m_Identity, this);//池实例自回收}
动态单体对象池
池对象–ID/池实例
针对多种小型需求对象池需求, 可以针对Component/Class/Monobehaviour的继承类型进行对象池状态管理.多用于简单的对象管理如UI Grid组件下的Object
ObjectPoolListBase<T, Y>.Spawn(T identity);//生成指定identity的物体ObjectPoolListBase<T, Y>.Recycle(T identity);//移除指定identity的物体
该工程将单体对象池控制器分成三类
ponent对象池ObjectPoolListComponent<T, Y>-GetComponent
2.Monobehaviour对象池 ObjectPoolListMonobehaviour<T, Y>-GetComponent
2.Class对象池 ObjectPoolListClass<T, Y>-Activator.CreateInstance
三类池只有实例化与Transform获取的差别
其中Class与Monobehaviour池都继承共同的接口
public interface IObjectPoolItemBase<T>{void OnInitItem();//池对象初始化void OnAddItem(T identity);void OnRemoveItem();Transform GetTransform();//获取对象的transform做显隐操作}
感谢观看全文 遇到问题请联系作者--StriteR /5/24