从零点五开始用Unity做半个2D战棋小游戏(十)
好久不見。
這是第27篇與游戲開發有關的文章。
| 寫在最前
這次想要做一個簡單且傳統的戰棋小游戲,大概的玩法是:在2D世界里創建一張由六邊形地塊組成的戰斗地圖,敵我雙方在地圖上輪流行動,并向對方發動攻擊,先消滅掉所有敵人的一方將獲得勝利。
預計將分為以下幾篇(未完成前可能會調整...):
1、創建戰場(已完成)
根據預定尺寸生成戰場地圖,并隨機一些障礙物。
2、添加地圖功能 (已完成)
實現戰場格子點擊反饋,地圖導航及范圍選定。
3、添加對戰雙方(已完成)
向戰場中添加作戰單位,作戰單位輪流行動,可進行移動、攻擊。
4、加入玩家控制(已完成)
玩家可控制一個戰斗單位,手動選擇移動目標及攻擊單位。
5、添加常用的界面(已完成)
建立界面管理器,加入一些常用的界面。
6、添加常用的戰場顯示(已完成)
為戰斗單位添加血條,加入傷害文字特效。
7、擴展作戰單位(已完成)
豐富戰斗元素,加入并實現手動釋放不同類型的技能。
8、加入AI系統(上)(已完成)
建立超級簡單的AI系統。
9、加入AI系統(中)(已完成)
調整AI系統的決策方式。
10、加入AI系統(下)
總結AI系統。
11、擴展戰場地圖
豐富戰場地圖,加入地形及道具等元素。
12、規范戰斗配置
可以通過規范化的數據結構配置戰場、職業、技能、道具等。
本次的主題是:總結AI系統。
項目使用的Unity版本為:Unity2018.3.0f2。
| 目標
在上一篇中,我對AI系統進行了重構,實現了一個簡單的用數值配置影響決策的AI系統。
本篇,將簡單介紹另一種AI系統的實現方式,并對近期三篇關于AI系統的文章做出總結。
| 一種新的AI系統
在設計AI系統之初,我拜托了好友Aillieo在工程中用另一種方法實現AI。
果然,他所采用的方法跟我的相比,有不小的差異,這也驗證了魯迅先生的一句話:
盡管大家的腦袋都差不多大,但所思所想卻各不相同。
魯迅先生的名言 (圖源網絡)
所以,本篇的上半部分,將會主要介紹Aillieo所設計的AI系統。
需要提前聲明的是,由于時間原因,在工程中并沒有實現這個AI的細節邏輯。
但是,雖然只是完成了基本結構,但仍可以對設計思路有一個較為清晰的認識。
| 系統的開始
一個連接了所有AI決策系統(Brain)的數據交換中心,是這個系統的基礎。
這個數據交換中心負責向所有戰斗單位廣播戰斗行為信息。
一個連接了所有AI大腦的數據交換中心
比如,當一個AI做出動作時,這個動作會通知到賣二手手機靚號交換中心,并且廣播給其他所有AI:這個家伙行動了!
| 信息的輸入
當戰斗數據從數據中心,被發送到某一個AI的Brain后,Brain會將信息進行處理為直接數據和間接數據。
戰斗行為信息從數據中心傳入Brain
直接數據是第一手的戰場數據,包括戰場上各個單位的位置、狀態、生命值、攻擊力等。
間接數據是根據策略的不同而去保存和監聽的數據,如戰場上造成傷害最高的單位,任意單位某個屬性達到某個臨界值,某個單位和自己的敵對程度等。
比如,當Brain接到了上面的行動信息后,首先會更新這個行動者移動后的位置(直接數據);接下來還會發現:咦,這不就是剛才揍過我的家伙么(間接數據)。
| 戰斗狀態及切換
每一個戰斗單位同一時間只能存在一種狀態,戰斗狀態直接影響了行動時的行為。
當Brain接到的戰斗信息被分別處理為直接和間接數據后,它將考慮是否需要切換戰斗狀態。
比如,當上面的Brain發現他的敵人已經進入了自己的“攻擊范圍”,就會將自己的狀態切換為“戰斗狀態”;當然,如果他本身就是戰斗狀態的話,那就不需要切換了。
| 行為樹與信息的輸出
其實,在每一個狀態的背后,都對應了一個行為樹,而真正做出決策、產生行為的家伙,是這個行為樹上的節點。
Brain決策了一個戰斗行為信息,并傳給數據中心進行廣播
比如,當輪到上面那個處在“攻擊”狀態的AI行動時,他行為樹中“仇恨優先”節點,會將仇恨值最高的單位選擇為目標單位,并向他發動攻擊。
行為樹是如今AI設計中較為常用的方法。由于它本身就是個十分龐大且復雜的話題,加之網上介紹它的資料又非常豐富,這里就不做過多的展開了。
| AI系統的總結
我以為,此前的使用數值配置驅動AI決策的系統,在描述一個AI的多種類型的行為時,是很吃力的。
比如,嘗試讓一個AI做出非戰斗的行為判斷:拾取道具、解除機關、與場景互動等,很難用數值來對不同類型的行為進行換算。
之所以可以在戰斗里得到驗證,是因為這里只是把它用在了對戰斗行為的決策上,而且這個戰斗行為本身也是很簡單的。
而本篇介紹的狀態機 + 行為樹的系統,稍加擴展,便可以在除戰斗以外的其他地方發揮作用,十分通用。
那么是否就說明數值配置驅動就一定沒有意義呢?
我不這么認為。
我所理解的狀態機、行為樹,是嘗試從人類解決問題的角度出發,將人在現實中處理問題的思考、行為過程梳理出來,并把這種流程化的結果編織成機器可以執行的邏輯,來進行行為的決策。而上篇的數值配置驅動的驅動方式,則是在決策具體一個或一系列問題時,對內因、外因共同作用產生結果的一個模擬,因此我認為兩者是可以結合在一起使用的。
| 寫在最后
最近事情太多,擠來擠去后,留給自己寫東西的時間還是非常有限,導致這個總結拖的太久。久到提筆寫時,居然都忘了之前的系統是怎么做的,上一篇又是怎么寫的了...無奈只能通過翻看之前的文章進行回憶...
行文至此,還是要感嘆一下自己對AI相關的內容知之甚少。實事求是的講,在動手搭建系統之前,對網上的資料,特別是對已經很成熟的“狀態機”、“行為樹”設計,也只是停留在概念上知道(現在也差不多)。
當然,這是我秉性使然的結果;對于一些不了解、感興趣、卻已經有較為成熟體系或總結的知識,在學習時反而會故意回避;寧愿多花些時間,用自己的方式摸索,等到有了自己的一套思路后,再翻看“答案”,看看誰的更有意思(雖然每次都輸)。雖然這是一種效率極低的學習方式,但是這種“游戲”帶來的樂趣,我是十分享受的。
好了,AI系統篇就暫告一段落,下一篇將繼續豐富游戲內容:加入地形及道具等元素。
愿不忘初心。
下回見。
總結
以上是生活随笔為你收集整理的从零点五开始用Unity做半个2D战棋小游戏(十)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零点五开始用Unity做半个2D战棋小
- 下一篇: 从零点五开始用Unity做半个2D战棋小