对象池:
假设有一个射击游戏,那么场景中必然会创建许多的子弹。如果对于子弹只进行创建子弹—销毁子弹的流程(创建子弹-->销毁)
,那么可能在1S间创建很多很多的子弹,也会销毁很多子弹,对于游戏性能来说是一个很大的阻碍,会严重的拖垮性能。解决方法就是用到对象池。
对象池管理了一个集合,以后每次创建子弹都是从对象池中取出,如果对象池中没有再创建子弹,而销毁子弹就是加入集合(取出子弹(创建子弹)-->加入集合)
。实际上就是通过一个集合管理创建的对象,销毁子弹就是加入集合,创建子弹时先去对象池查看,有的话就取出,没有就创建。
一个简单的对象池管理器
//对象池管理器
public class PoolTest : MonoBehaviour
{
//对象池集合
public List<GameObject> list = new List<GameObject>();
//游戏预制体
public GameObject GoPrefabs;
//对象池能保存的最大个数
public int MaxCount = 100;
//对象保存到对象池
public void push(GameObject go)
{
if (list.Count < MaxCount)
{
list.Add(go);
}
else
{
Destroy(go);
}
}
//从对象池取出一个对象
public GameObject Pop()
{
if (list.Count > 0)
{
GameObject go = list[0];
list.RemoveAt(0);
return go;
}
return Instantiate(GoPrefabs);
}
//清空对象池
public void Clear()
{
list.Clear();
}
}
public class Test : MonoBehaviour
{
//创建一个集合保存场景中存在的对象(不在对象池的对象)
private List<GameObject> list = new List<GameObject>();
void Update()
{
//点击鼠标左键创建一个对象
if(Input.GetMouseButtonDown(0)){
//从对象池中取出一个对象
GameObject go = GetComponent<PoolTest>().Pop();
list.Add(go);
go.SetActive(true);
}
//点击鼠标右键删除一个对象
if (Input.GetMouseButtonDown(1))
{
//放入对象池
//判断保存场景中对象的list是否为空
if (list.Count > 0)
{
GetComponent<PoolTest>().push(list[0]);
list[0].SetActive(false);
list.RemoveAt(0);
}
}
}
}
在unity创建一个Cube并设为预制体,再创建一个空对象,并将PoolTest和Test挂载到上面。
首次创建Cube对象:
删除部分对象:
再次创建对象(实际上从对象池中取出):