1.對象池的作用
使用完不直接刪除物體,而是將其放回池子裏,需要用的時候再取出來。 對象池模式的出現主要優化兩點:
1、防止對象被頻繁的創建和刪除,從而內存抖動、頻繁GC(垃圾回收)
2、對象初始化成本較高
比如遊戲中的子彈 怪物 等
2.對象池的簡單實現
首先創建一個腳本
public class Object : MonoBehaviour
{
public GameObject Ball;//對象
private List<GameObject> Objects;
private int initpoolsize = 10;//初始化池子大小
private bool isAuto ;//是否自動生成
public static Object Instance;//單例模式
private void Start()
{
Instance = this;
Objects = new List<GameObject>();//賦值
for(int i = 0; i < initpoolsize; i++)
{
GameObject Obj = Instantiate(Ball);
Obj.transform.parent = transform;//設置掛載腳本物體爲生成子物體的父物體
Obj.SetActive(false);//不顯示
Objects.Add(Obj);//爲池子添加對象
}
}
public GameObject GetGameObject()
{
for(int i = 0; i < initpoolsize; i++)
{
//當這個對象不是出於激活狀態的時候
if (!Objects[i].activeSelf)
{
Objects[i].SetActive(true);//顯示
return Objects[i];
}
}
if (isAuto)
{
GameObject obj = Instantiate(Ball);
Objects .Add(obj);//添加到池中
return obj;
}
return null;
}
}
有些比較難懂的註釋大致標明瞭
然後就是我們給產生的對象寫一個很簡單很簡單的腳本
爲了運行觀察效果的時候更能容易觀察
public class Ball : MonoBehaviour
{
private float timer = 0;
private void OnEnable()//在該物體產生的時候
{
//設置初始位置 否則該物體會出現在上次物體運動的位置
transform.position = Vector3.zero;
timer = 0;
}
private void Update()
{
transform.Translate(Vector3.forward * Time.deltaTime * 20);
//向前運動
if (timer >= 2)
{
timer = 0;
gameObject.SetActive(false);
}
else
{
timer += Time.deltaTime;
}
}
}
然後在給攝像機添加一句
if (Input.GetMouseButtonDown(0))
{
Object .Instance.GetGameObject();//利用單例模式實現
}
然後在unity中牀加一個空物體 掛上第一個(Object)腳本
然後創建一個預製體 掛上Ball腳本
在給攝像機掛上最後一句代碼
即可實現最簡單對象池
效果圖
如果你手速比較快的話 我們可以改變池子的大小即可產生多個Sphere