1.對象池簡單定義
同學您好,對(dui)象(xiang)(xiang)池是(shi)一種Unity經常(chang)用到(dao)的(de)內存管理服務,針對(dui)需要經常(chang)生成(cheng)消(xiao)失的(de)對(dui)象(xiang)(xiang),作用在(zai)于可以減(jian)少創建每個對(dui)象(xiang)(xiang)的(de)系統(tong)開銷(xiao)。我們在(zai)對(dui)象(xiang)(xiang)需要消(xiao)失的(de)時候(hou)不Destroy而(er)是(shi)SetActive(false),然后放入池子中(zhong)(Queue),當需要再次顯示一個新的(de)對(dui)象(xiang)(xiang)的(de)時候(hou),先去池子中(zhong)看有(you)沒有(you)隱(yin)藏的(de)對(dui)象(xiang)(xiang),有(you)就取出SetActive(true),若池子里沒有(you)可用的(de)則再Instantiate。
2.使用對象池的原因
在Unity游戲開發的(de)(de)過程中經常(chang)會(hui)(hui)創建一(yi)(yi)(yi)(yi)些新(xin)(xin)的(de)(de)對(dui)(dui)象,如果數量(liang)較少還可(ke)以(yi)接受,如果創建的(de)(de)新(xin)(xin)對(dui)(dui)象數量(liang)龐大(da)(da),那么(me)對(dui)(dui)內(nei)存而(er)言是(shi)(shi)一(yi)(yi)(yi)(yi)個極大(da)(da)的(de)(de)隱患。例如射擊游戲當中,每發射一(yi)(yi)(yi)(yi)顆子(zi)(zi)彈(dan),都要創建一(yi)(yi)(yi)(yi)個新(xin)(xin)的(de)(de)子(zi)(zi)彈(dan)對(dui)(dui)象,那么(me)子(zi)(zi)彈(dan)是(shi)(shi)數量(liang)龐大(da)(da),可(ke)想而(er)知一(yi)(yi)(yi)(yi)場游戲當中會(hui)(hui)創建多少這樣的(de)(de)新(xin)(xin)對(dui)(dui)象,那么(me)如果這些子(zi)(zi)彈(dan)創建之(zhi)后(hou)都對(dui)(dui)游戲起(qi)著關鍵且持續性的(de)(de)作用也(ye)(ye)無可(ke)厚非(fei),問題(ti)是(shi)(shi)子(zi)(zi)彈(dan)發射完成之(zhi)后(hou),幾秒之(zhi)后(hou)就(jiu)不再擁有任(ren)何的(de)(de)意義,一(yi)(yi)(yi)(yi)般會(hui)(hui)將(jiang)它自動的(de)(de)隱藏,也(ye)(ye)就(jiu)是(shi)(shi)我們(men)所說的(de)(de)SetActive(false),因此(ci)大(da)(da)量(liang)的(de)(de)非(fei)活躍對(dui)(dui)象出現(xian)在游戲場景當中。
由于(yu)對(dui)象(xiang)池中的(de)對(dui)象(xiang)只(zhi)是(shi)SetActive(false)了,并(bing)(bing)非真(zhen)正銷毀了,所(suo)以(yi)一般運用(yong)于(yu)游戲中經常用(yong)到或需大量生成(cheng)的(de)物體(ti)。并(bing)(bing)不能將所(suo)有對(dui)象(xiang)都用(yong)此技術,如若不然便是(shi)得不償失了。
3.創建并使用一個簡單對象池
首先(xian)我(wo)們先(xian)生成(cheng)一個(ge)對(dui)象(xiang)池的(de)class,里面的(de)內容就很簡單,首先(xian)有(you)一個(ge)Queue用來存放(fang)池子(zi)中的(de)對(dui)象(xiang),然后實(shi)現(xian)兩個(ge)方法,一個(ge)取(qu)對(dui)象(xiang),一個(ge)放(fang)對(dui)象(xiang)。取(qu)對(dui)象(xiang)的(de)時候,若池子(zi)中有(you)可(ke)用對(dui)象(xiang)則取(qu)出一個(ge),若沒有(you)則Instantiate一個(ge);放(fang)對(dui)象(xiang)即將(jiang)對(dui)象(xiang)SetActive(false)并且放(fang)入池子(zi)中。