using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 泛型对象池
/// </summary>
/// <typeparam name="T"></typeparam>
public class MyObjectPool<T>where T:class
{
public List<T> mObjectPool; //对象池
public delegate T NewDel();
public NewDel mNewDel; //新增对象委托
public delegate void ResetDel(T t);
public ResetDel mResetDel; //重置对象委托
public MyObjectPool(NewDel newDel, ResetDel resetDel) //初始化对象池
{
mObjectPool = new List<T>() ;
mNewDel = newDel;
mResetDel = resetDel;
}
public T GetObject() //获取对象池中对象
{
if (mObjectPool.Count == 0) //当对象池中没有对象时,新建一个对象
{
T t = mNewDel();
return t;
}
else { //返回对象池中的对象
T t = mObjectPool[mObjectPool.Count - 1];
if (mResetDel != null) //重置对象
{
mResetDel(t);
}
return t;
}
}
public void Recycle(T t) //回收对象
{
if (!mObjectPool.Contains(t))
mObjectPool.Add(t);
}
public void Clear() //清空对象池
{
mObjectPool.Clear();
}
}
///<summary>
///使用池子的测试类
///</summary>
public class Test : MonoBehaviour
{
public GameObject ballet; //子弹的预设体,在unity引擎中引用
private MyObjectPool<GameObject> pool;
void Start()
{
pool = new MyObjectPool<GameObject>(NewBallet, Reset);
}
//实例化新子弹的方法
private GameObject NewBallet()
{
GameObject g = Instantiate(ballet) as GameObject; //实例化新子弹,实例化过程中需要设置子弹的位置等初始化操作写在这
return g;
}
//重置对象的方法,
private void Reset(GameObject g)
{
g.transform.position = Vector3.zero;
g.transform.rotation = Quaternion.identity;
g.SetActive(true); //从池子中取后将物体设为可见,也可用其他方法代替
//......
}
//销毁对象的方法
private void Destroy(GameObject g)
{
g.SetActive(false); //放入池子前将物体设为不可见
pool.Recycle(g);
}
}
对于面试经常遇到的对象池问题,自己整理后,所写的一个对象池,做个记录!