初識unity對象池

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

發佈了64 篇原創文章 · 獲贊 63 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章