Unity对象池的简单用法
对象池是当物体需要被大量地创建与删除同时还需要复用时所使用的方式。
对频繁创建与删除的物体不进行频繁创建与删除,因为频繁地使用instantiate函数和Destroy函数比较耗费内存。引用了一个对象池的概念,用类似SetActive的方式使物体伪创建和伪删除,当一个位置的物体消失,也就是SetActive(false)后,另一个位置需要显示时,会在需要的位置SetActive(true),以这种方式来节省内存的消耗,是一种在游戏设计中经常使用的优化策略。
举一个简单的例子
创建一个空物体,附上如下代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool : MonoBehaviour
{
public static ObjectPool instance;
Stack<GameObject> pool=new Stack<GameObject>();
// Start is called before the first frame update
void Start()
{
instance = this;
}
public void Delete(GameObject g)
{
g.SetActive(false);
pool.Push(g);
}
public GameObject Creat(GameObject prefab,Vector3 position,Quaternion qua)
{
GameObject g=null;
if(pool.Count>0)
{
g=pool.Pop();
g.SetActive(true);
g.transform.position = position;
g.transform.rotation = qua;
}
else
{
g = Instantiate(prefab, position, qua);
}
return g;
}
// Update is called once per frame
}
再创建一个空物体,附上如下代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PoolTest : MonoBehaviour
{
public GameObject prefab;
public Stack<GameObject> s = new Stack<GameObject>();
// Start is called before the first frame update
public void Creat(){
s.Push(ObjectPool.instance.Creat(prefab, Vector3.one, Quaternion.identity));
}
public void Delete()
{
ObjectPool.instance.Delete(s.Pop());
}
// Update is called once per frame
}
将需要操作的物体设为预制体拖入PoolTest的空槽中。创建两个button,一个命名为creat,另一个命名为delete,分别给上PoolTest中的creat和delete函数。运行场景,点击按钮我们会看到已创建的物体以SetActive的方式隐藏和显示(当没有物体继续delete会报错)。