200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > Unity3D 对象池 静态预制件与动态单体

Unity3D 对象池 静态预制件与动态单体

时间:2023-07-05 07:18:48

相关推荐

Unity3D 对象池 静态预制件与动态单体

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。