創作內容

9 GP

[C#/Unity] Object pooling - 基本物件池與應用

作者:HaoX@ミリシタ│Unity(遊戲引擎)│2018-08-17 17:22:00│巴幣:18│人氣:2461
[C# / Unity 物件池應用]

你也可以在我的部落格上閱讀此篇文章

什麼是Object pooling

在我們製作一些遊戲的時候,常常需要使用到一些重複且相同的物件,

如果我們照著一般物件產生以及消除的方法:Instantiate 以及 Destroy,

會使許多GameObject(object)用完慘遭系統GC,如果像是子彈或者音樂遊戲的object被大量GC,

很可能造成遊戲卡頓,對於音樂遊戲或者是捲軸射擊遊戲都是相當致命的傷害,

為了避免這種問題,我們使用Object pool來儲存可以使用的object們,來免於上述的問題。

那麼Object pool該如何在C#中實作呢?

以下是一個Object pool 的簡單範例:


可以看到,我使用Queue作為最基本的element存放結構,

在這邊稍微補充Queue的作用給沒有聽過的人:

Queue 是一個first in first out(先進先出)的資料結構,可以用來存放需要順序性的資料,例如網路

傳送的封包等,Queue有幾個基本的操作:Enqueue可以將物件存放到Queue的尾端,Dequeue

可以從Queue的開頭來拿取物件,對於我們這個object pool的實作並不是唯一的選擇,只是筆者

習慣上所做的選擇而已。

另外,在這個class中,可以看到建構子需要傳入創建object的創建方式,對於一般c#的物件來

說,通常是以new運算子開頭的建構函數,而對於unity的GameObject來說,便是Instantiate方法

了。

使用上,只需要呼叫GetObject就可以接收到object pool內儲存的物件,如果物件池中已經沒有物

件了,我們就會使用一開始指定的方法出創建新的物件來回傳。

另外,當我們使用完這個物件之後,我們可以呼叫Recycle方法,將這個物件回收起來,這樣如果

下次需要呼叫object pool裡頭的物件,我們就可以重複利用這個物件了!

如何將物件池應用於Unity中

我們目前實作的物件池,其實只能將物件這個reference記錄起來,避免它被系統給GC,但如果

要真的在Unity裡面重複使用,還必須將物件本身藏起來才行,例如下面這個子彈發射的例子:


在回收子彈時,同時將它設為Inactive。


如果我們從pool中拿取子彈拿來使用,就必須將它Active,否則他是無法運作的。

當然,在Unity的Object pool實作上面,除了將他Inactive拿掉以外,也可以將該GameObject移出

遊戲畫面外,如果有較為耗效能的component再利用腳本關閉,這樣會比active該GameObject

能獲得更好的效能,大家有興趣的話,也可以自己實作看看喔!

這是上面的子彈範例專案檔,大家也可以下載下來試試看:Google雲端

*本文章提及所有code以及專案中所有code都可以任意修改使用,不需進行告知
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4097428
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:C#|CSharp|Programming|程式|遊戲製作|Unity|遊戲引擎|Unity(遊戲引擎)

留言共 1 篇留言

黎黎貓
感謝分享:3
自己之前也是用Instantiate跟Destroy去做射擊子彈的部分,
不過因為遊戲不大,沒甚麼問題XD
上課聽過Queue觀念倒是還沒實際操作過,有機會來試試!

08-17 19:41

HaoX@ミリシタ
如果能幫上忙就好了(^ω^)/
08-18 14:46
我要留言提醒:您尚未登入,請先登入再留言

9喜歡★haolf2 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:【心得】請問您今天要來點... 後一篇:[C#/Unity] 腳...

追蹤私訊切換新版閱覽

作品資料夾

n115PSG
天阿,PSG打贏G2是怎麼回事?太神啦!看更多我要大聲說昨天17:38


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】