Unity SKFramework框架(五)、ObjectPool 对象池
2023-09-27 14:19:52 时间
目录
简介
框架中将对象池划分为两种,一种是通过new运算符创建对象的对象池,另一种是对象类继承自MonoBehaviour,需要自定义创建方法的对象池,我们将它们分别称为ObjectPool、MonoObjectPool。
为需要实现对象池管理的对象类继承IPoolable接口,接口中包含bool类型字段IsRecycled,用于标记该对象是否已经回收,以及OnRecycled方法,用于实现对象的回收事件。
一、ObjectPool
以一个Person类为例,为其继承IPoolable接口,并实现接口中属性和方法:
public class Person : IPoolable
{
public string Name { get; set; }
public int Age { get; set; }
public float Weight { get; set; }
public bool IsRecycled { get; set; }
public void OnRecycled()
{
Name = null;
Age = 0;
Weight = 0f;
}
}
1.分配对象
public class Example : MonoBehaviour
{
private void Start()
{
//分配对象
Person person = ObjectPool.Allocate<Person>();
person.Name = "CoderZ";
person.Age = 28;
person.Weight = 60f;
}
}
2.回收对象
public class Example : MonoBehaviour
{
private void Start()
{
//分配对象
Person person = ObjectPool.Allocate<Person>();
person.Name = "CoderZ";
person.Age = 28;
person.Weight = 60f;
//回收对象
ObjectPool.Recycle(person);
}
}
3.缓存数量
对象池中默认的最大缓存数量为9,可以通过如下方式修改该值,当我们修改该值时,系统会判断池中的数量是否已经大于目标值,如果大于则根据差值进行释放。
//设置对象池的最大缓存数量
ObjectPool.SetMaxCacheCount<Person>(100);
4.释放对象池
释放对象池不仅是释放池中的对象,对象池本身也会被释放。
//释放对象池
ObjectPool.Release<Person>();
二、MonoObjectPool
以一个Bullet子弹类为例,它挂载于子弹的Prefab预制体上
using UnityEngine;
using SK.Framework;
public class Bullet : MonoBehaviour, IPoolable
{
public bool IsRecycled { get; set; }
public void OnRecycled()
{
gameObject.SetActive(false);
transform.localPosition = Vector3.zero;
transform.localRotation = Quaternion.identity;
}
}
1.创建方法
Mono类型的对象池,我们在使用之前首先需要自定义一个创建方法:
using UnityEngine;
using SK.Framework;
public class Example : MonoBehaviour
{
//子弹预制体
[SerializeField] private GameObject bulletPrefab;
private void Start()
{
MonoObjectPool.CreateBy(() =>
{
var instance = Instantiate(bulletPrefab);
instance.transform.SetParent(transform);
instance.transform.localPosition = Vector3.zero;
instance.transform.localRotation = Quaternion.identity;
instance.SetActive(true);
Bullet bullet = instance.GetComponent<Bullet>();
return bullet;
});
}
}
2.分配对象
//分配对象
Bullet bullet = MonoObjectPool.Allocate<Bullet>();
3.回收对象
//分配对象
Bullet bullet = MonoObjectPool.Allocate<Bullet>();
//回收对象
MonoObjectPool.Recycle(bullet);
4.缓存数量
//设置对象池的最大缓存数量
MonoObjectPool.SetMaxCacheCount<Bullet>(99);
5.释放对象池
//释放对象池
MonoObjectPool.Release<Bullet>();
相关文章
- 面向对象银角大王补充2-self就是调用当前方法的对象-静态字段,公有属性-封装的理解-继承的理解,普通方法,静态方法
- 块存储、文件存储、对象存储意义及差异
- 接触LLBL Gen Pro 对象关系映射框架后 前途变的一片光明
- LLBL Gen Pro 4.2 Lite 免费的对象关系映射开发框架与工具
- 转: RPC框架 远程对象服务引擎Hprose
- Sybase 判断对象是否存在于数据库中的两种方式
- 一整套美团面经(给对象超用心整理的)
- js关于函数和对象的概念
- 使用Python,OpenCV进行对象追踪
- 实践操作:六步教你如何用开源框架Tensorflow对象检测API构建一个玩具检测器
- WCF后续之旅(10): 通过WCF Extension实现以对象池的方式创建Service Instance
- 使用Entity Framwork 保存数据时,提示不能在对象中插入重复键,违反了PRIMARY_KEY约束
- 【EventBus】事件通信框架 ( 订阅类-订阅方法缓存集合 | 事件类型-订阅者集合 | 订阅对象-事件类型集合 )
- 【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )
- C++ 类 & 对象