在游戏当中,有很多时候需要重复地创建或删除某些游戏对象,此时会耗费系统资源,从而影响性能,利用对象池可以解决这个问题。对象池能够节省内存,优化程序流畅程度。
把对象放在一个集合里,通过集合来管理对象,不用对象的时候不要删除对象,而是放到集合里;需要对象时,先在集合里找是否有该对象,有直接使用,没有创建后使用。
1、将一个游戏对象制作成预制体。
2、创建一个空游戏对象并挂载脚本。
3、源代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PoolTest : MonoBehaviour
{
// Start is called before the first frame update
//对象池管理器
public List<GameObject> list = new List<GameObject>();
public GameObject goPrefab;
public int maxCount;
//对象保存到对象池
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(goPrefab);
}
//清除对象池
public void Clear()
{
list.Clear();
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Tset : MonoBehaviour
{
// Start is called before the first frame update
//管理不在对象池中的对象
private List<GameObject> list = new List<GameObject>();
// Update is called once per frame
void Update()
{
//创建
//从对象池取出
if (Input.GetMouseButtonDown (0))
{
GameObject go = GetComponent<PoolTest>().Pop();
list.Add(go);
go.SetActive(true);
}
//删除
//放入对象池
if(Input.GetMouseButtonDown (1))
{
if(list.Count >0)
{
GetComponent<PoolTest>().Push(list[0]);
list[0].SetActive(false);
list.RemoveAt(0);//从列表中移除,代表不存在与场景当中,而是存在于对象池当中
}
}
}
}
4、最终效果:
按鼠标左键,会创建一个游戏对象;
按鼠标右键,会删除一个游戏对象。
通过按鼠标左右键来在场景中进行游戏对象的删除和创建,但实际上,并不是真正的删除,而是将游戏对象的状态进行true/false的转变,从而达到减少系统资源消耗和优化程序流程程度的目的。