简介
对象池:就是一个集合(使用哪种数据结构自己看着办)。当我们需要一个“物体实例”时,看对象池中是否有,如果有,就直接使用,不用重新创建。如果没有就
new
一个,当新new
的对象不使用时,就加入到池中(集合)。往复循环,达到一个对象,反复使用的目的。—— 单集合对象池。
在IF框架中,有多种“对象池”。我们使用的话只需要 实现指定的接口即可,不用再自己
简单使用
代码如下:
using UnityEngine;
using IFramework;
public class Enemy
{
public string name;
public Enemy(string name){
Debug.Log("创建:"+name);
this.name = name;
}
~Enemy(){
Debug.Log("销毁"+name);
}
}
// 继承 对象池,并重写抽象成员
public class TimeTaskPool : ObjectPool<Enemy>
{
protected override Enemy CreatNew(IEventArgs arg, params object[] param)
{
return new Enemy(param[0].ToString());
}
}
public class TestPool : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
TimeTaskPool pool = new TimeTaskPool();
Enemy enemy1 = pool.Get(null, "快刀手——敌人");
Enemy enemy2 = pool.Get(null, "突击者——敌人");
print(enemy1.name);
print(enemy2.name);
pool.Set(enemy1);
Enemy enemy3 = pool.Get();
print(enemy3.name);
}
}
运行结果:

说明:
- 只需要将自定义的类(对象池)继承自“ObjectPool<T>”即可。 并重写 抽象成员:
CreatNew()
即可。 - 这里创建两个敌人对象。重点在于
enemy3
。再获得enemy3 之前,先把enemy1 放回池中,所以 enemy3 实际获得的对象 是 enemy1. - 最后Start()结束。
高级使用
代码如下:
using UnityEngine;
using IFramework;
// 要求要存放的物体必须实现:IPoolObject接口
public class Enemy : IPoolObject
{
public string name;
public Enemy(string name)
{
Debug.Log("创建(构造函数):" + name);
this.name = name;
}
~Enemy()
{
Debug.Log("销毁" + name);
}
public void OnClear(IEventArgs arg, params object[] param)
{
Debug.Log("清理" + name);
}
public void OnCreate(IEventArgs arg, params object[] param)
{
Debug.Log("创建" + name);
}
public void OnGet(IEventArgs arg, params object[] param)
{
Debug.Log("获取" + name);
}
public void OnSet(IEventArgs arg, params object[] param)
{
Debug.Log("存入" + name);
}
}
public class TestPool : MonoBehaviour, IPoolObjectOwner
{
// Start is called before the first frame update
void Start()
{
//设置一下池子的最大容量
var pool = PoolManager.GetPool<Enemy>();
pool.SleepCapcity = 2;
pool.AutoClear = true;
//设置一下池子的CreateNew方法
PoolManager.AddCreaterDel<Enemy>((type, arg, para) =>
{
Enemy gg = new Enemy(para[0].ToString());
return gg;
});
Enemy enemy1 = pool.Get(null, "快刀手——敌人") as Enemy;
Enemy enemy2 = pool.Get(null, "突击者——敌人") as Enemy;
print(enemy1.name);
print(enemy2.name);
pool.Set(enemy1);
Enemy enemy3 = pool.Get() as Enemy;
print(enemy3.name);
}
}
运行结果:

结尾
以上内容是 作者个人的理解,如有错误,欢迎指出。
顺便给出OnClick大佬自己 写的文档地址:007 对象池
如果对 IF框架有其他看法,也欢迎大家 进群交流。
网友评论