前往
大廳
主題

《Unity練習》微生物 模擬小遊戲

佑紙 | 2021-07-24 00:28:44 | 巴幣 108 | 人氣 526

*這只是練習作品  並沒有互動成分*
這是我先練習用Unity 寫的小模擬遊戲
是一個模擬微生物在地圖上亂跑的小遊戲
主要是先熟悉 C# 的語法還有如何繼承及建立類別架構
順便摸清楚Unity 內建的其他類別怎麼用
同時測試看看Unity 效能優化的情況
所以遊戲中會有越來越多的遊戲物件來做壓力測試
測試看看有這麼多的 <GameObject> 都有 <Monobehaviouro> 及 <Sprite>
到底跑不跑的順暢


遊戲中微生物的簡介
大多微生物都有的特性
<壽命>
微生物有壽命限制, 以秒計時(但實際上以幀數計), 通常介於三十秒至數分鐘
當壽命用盡則會被從遊戲消失

<生命>
微生物被攻擊會減少生命, 生命歸零, 也會被移除

<分裂>
微生物能分裂出一個新的個體, 但是大多微生物一生當中能分裂的次數有限

<密度抑制繁殖>
為了控制微生物數量, 加上模擬環境中會有環境乘載限制
微生物一出生會按照附近同種微生物數量, 使該微生物一生能分裂的次數下降
SC: 微生物分裂次數上限 Alpha: 影響係數(通常 1<Alpha<1.5 )
SCmax: 分裂次數的上限值 N: 附近同種的微生物數量
公式
SC = SCmax / ( Alpha ^ N )
( 通常至少能分裂一次 )

<密度抑制壽命>
也是為了控制微生物數量, 同時模擬微生物在生物數量過於密集的環境生存品質會受影響
微生物一出生會按照附近同種微生物數量, 使該微生物的壽命更短
BasicLife: 基礎的壽命, 避免壽命過短 SumLife: 微生物總共能存活的壽命
ExtraLife: 額外(變動)壽命, 會隨生物密度而減少
N: 附近同種的微生物數量 Alpha: 影響係數(通常 1<Alpha<1.5 )
公式
SumLife = Basic + ( ExtraLife / ( Alpha ^ N ) )

各類別的微生物
藍色(基礎微生物)
隨意地遊走, 並且都有上述特性

黃色(遷移微生物)
都有上述特性, 此外遊走時會朝著特定方向遊走, 並且方向變動不大
並且會隨著群體移動, 可能會集體撞向邊界而消失
一個遷移微生物剛出生時, 會是沒有群體的狀態, 並會按著自己的方向前進, 一段時間會試著找一個附近的群體加入(有可能是原本的群體)

綠色(蔓延微生物)
並非擁有上述所有特性, 除了剛出生時會從母體離開以外都不遊走
沒有分裂次數限制, 但是附近必須要有足夠空曠的地區才分裂, 並且新的子生物會前往該地點
因為這些特性, 此種微生物會不段擴散, 但是會被任何其他生物阻擋分裂路徑

紫色( "浪" 蔓延微生物 )
與普通蔓延微生物相似, 但是分裂次數有限制, 但不受生物密度下降
每當該微生物能分裂時, 它會向附近任意方向找一地點, 如果該地點是空地, 則向該地點分裂一個新個體, 並減少一次分裂次數, 若不是空地則依舊減少一次分裂次數, 但是沒有新個體
會稱為 "浪" 是因為它和蔓延微生物一樣會蔓延, 但是蔓延開來後, 原本在中央的生物會因為沒有空地分裂, 而耗光分裂次數, 最後壽命用盡而消逝, 留下的空洞也不會被補上, 因為洞附近的微生物也沒有分裂次數了, 最後 "浪" 蔓延微生物會像是一道浪向外移動

紅色(肉食微生物)
擁有上述特性, 行為與基礎微生物類似
若附近有非肉食微生物之微生物, 會以該微生物為目標追擊
直到目標死亡為止

白色(抗敵微生物)
擁有上述特性, 行為與基礎微生物類似
若附近有具攻擊行為的敵對微生物(目前也只有肉食微生物)
會以該微生物為目標追擊, 直到目標死亡為止


*遊戲優化機制*
時間複雜度
如果遊戲中有n個微生物, 那麼每一幀的複雜度至少有n
如果微生物穢語附近微生物互動, 例如偵測生物密度或是尋找攻擊目標
需要把所有微生物都檢查一遍是否符合條件, 這件事本身也會是n
所以總複雜度是 n*n, 這樣微生物數量會嚴重影響效能
所以必須把尋找的複雜度下降

優化方式 : 分區
在每幀運行時遊戲會把所有微生物根據他們所在座標分區
分區( 四捨五入至整數(微生物.座標.x/10f), 四捨五入至整數(微生物.座標.y/10f) )
簡單說是每10*10的方格單位為一區
之後微生物需要尋找附近微生物時, 只需要找它所在那區及周圍的區域即可
除非是最差情況 : 所有微生物都在同一區
否則尋找這件事的複雜度是小於n不少的
另外因為我刻意用生物密度去限制分裂所以很難讓所有微生物都在同一區
(示意圖)

下載

創作回應

Ying
蠻有趣的
2021-07-25 20:00:20

更多創作