前言
对象池用于减少内存开销,其原理就是把可能用到到的对象,先存在一个地方(池),要用的时候就调出来,不用就放回去,而不是要用的时候创建,不用的时候销毁。减少性能损耗
一、对象池是什么?
对象池是游戏编程中非常常用的优化策略以及设计模式
二、使用步骤
1.具体代码
1、对象池类 ObjectPool
定义一个最大的数量、预制体和储存队列
public int count;
public GameObject bullet;
public Queue<GameObject> m_PoolQueue = new Queue<GameObject>();
进行单例并向对象池中添加预制体对象
private static ObjectPool instance;
public static ObjectPool Instance
{
get { return instance; }
}
private void Awake()
{
instance = this;
FIllPool();
}
实例出预制体并设置父级
private void FIllPool()
{
for (int i = 0; i < count; i++)
{
GameObject prefab = Instantiate(bullet);
prefab.transform.SetParent(transform);
ReturnPool(prefab);
}
}
将预制体失活 ,存入储存队列
public void ReturnPool(GameObject prefab)
{
prefab.SetActive(false);
m_PoolQueue.Enqueue(prefab);
}
提供外部获取预制体的方法
public GameObject GetBUlletFormPool()
{
//如果没有预制体
if (m_PoolQueue.Count == 0)
//向池中注入
FIllPool();
//得到队中的预制体
var obj = m_PoolQueue.Dequeue();
return obj;
}
2、子弹类
using UnityEngine;
public class Zd : MonoBehaviour
{
//开始的时间
float beginTime;
//存在的时间
public float existenceTime;
private void OnEnable()
{
//初始化开始时间
beginTime = Time.time;
}
private void Update()
{
//当持续的时间大于设置的存在时间
if ((Time.time - beginTime) > existenceTime)
{
//调用对象池中入队的方法、将预制体失活并入队
ObjectPool.Instance.ReturnPool(gameObject);
}
//子弹向前飞行
transform.position += transform.forward * 30 * Time.deltaTime;
}
}
3、玩家类使用对象池生成子弹
//按下空格 在Update()中调用
if (Input.GetKeyDown(KeyCode.Space))
{
//从对象池中获取预制体
GameObject zd = ObjectPool.Instance.GetBUlletFormPool();
//将子弹显示
zd.SetActive(true);
zd.transform.position = transform.position;
zd.transform.eulerAngles = transform.eulerAngles;
}