Unity3D內存管理之資源池Object Pool(適合初學者)

引言:堅持更新,堅持更新,堅持更新。今日分享的是對象池的簡單應用,從而有效優化內存。這裏主要根據坦克大戰的案例,講解資源池的基本用法。項目使用的源文件在文末提供。本人也只是一名即將畢業的大學生,講解如有不足的地方,各位客官還請提點!
開發版本:Unity 5.3.5f1
適合人羣:適合初學者


一、什麼是資源池

將一定數量的對象預先存儲在資源池中,當需要的時候使用,而不是每次都實例化一個對象,不用的時候再放回。例如一款射擊類遊戲,需要不斷的發射子彈,如果每發射一顆子彈,都要實例化一個對象,隨後再銷燬對象,再實例化對象,必然會消耗較大的內存。如果預先就將子彈實例化出一定的數量,並保存在彈夾中,發射的時候,取出來發射,不用的時候,再放回彈夾。如此反覆利用,可以避免頻繁實例化和銷燬帶來的性能消耗。這裏的彈夾的概念就是資源池模式!

二、實現思路

以之前小生的坦克大戰爲例(傳送門:https://blog.csdn.net/qq_35361471/article/details/79321304),來實現子彈的資源池功能。在遊戲開始時,預先實例化30枚子彈在場景中,並且隱藏起來。當坦克發射子彈的時候,顯示子彈。當子彈碰撞到物體爆炸時,將其隱藏起來。假設30枚子彈在同一時刻都在場景中使用(該遊戲規模較小,30枚子彈足夠了,但存在子彈不夠的情況),則實例化新的子彈,提供使用。可以使用列表來存儲實例化的子彈。使用流程圖如下所示:


三、代碼實現

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class BulletPool : MonoBehaviour
{
    public int count = 30;//預定義子彈的數量
    public GameObject bulletPrefab;

    private List<GameObject> bulletList = new List<GameObject>();//列表存儲實例化的子彈

    private void Awake()
    {
        InitPool();
    }

    //初始化資源池
    private void InitPool()
    {
        for (int i = 0; i < count; i++)
        {
            CreatBullet();
        }
    }

    //實例化一個子彈,加入到列表中,並隱藏
    private GameObject CreatBullet()
    {
        GameObject go = Instantiate(bulletPrefab) as GameObject;
        bulletList.Add(go);
        go.transform.SetParent(transform);
        go.SetActive(false);
        return go;
    }

    //返回子彈列表中還沒有使用的子彈對象,如果沒有的話,則實例化新的子彈
    public GameObject GetBullet()
    {
        foreach (GameObject bullet in bulletList)
        {
            if (bullet.activeInHierarchy == false)
            {
                bullet.SetActive(true);
                return bullet;
            }
        }
        return CreatBullet();
    }

    //回收子彈到資源池中
    //回收成功返回true,失敗返回false
    public bool PutBack(GameObject go)
    {
        if (bulletList.Contains(go))
        {
            go.SetActive(false);
            return true;
        }
        return false;
    }
}

源項目文件鏈接:鏈接:https://pan.baidu.com/s/1f1-nQtS3B30Q0-NVOr_TMg 密碼:5ptj

共同努力學習Unity!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章