从零点五开始用Unity做半个2D战棋小游戏(九)
寫在最前
?
這次想要做一個簡單且傳統的戰棋小游戲,大概的玩法是:在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的行為,以期使戰斗變得更加有趣。
另外,本篇將會有大量的數據表、圖,可能有些枯燥,希望您能耐心看下去,謝謝。
那就讓我們開始吧。
?
| 思考的出發點
我是這么開始的。
首先,我對戰場內出現的戰斗單位,進行了角色(職業)劃分,它們分別是:
1、坦克;
2、輸出;
3、治療。
好吧, 我猜你一定知道,這是最簡單的鐵三角組合,這里就不解釋這三種角色的戰場定位了。
劉關張應該也算是一種鐵三角組合吧 (圖源網絡)
之所以做這樣的設定,是為了可以從簡單入手,對AI的行為進行分類。
| 行為分類
現在,結合上述三種定位,試想一下我們自己在扮演這三種角色做決策時的樣子。
我們可以近似的將AI的行為分為以下幾類:
1、制造仇恨(嘲諷);
2、制造傷害(輸出);
3、恢復隊友(恢復)。
其實,上述三種行為,都可以理解為是主動采取的行為,也可以認為是一種理性的戰斗策略。
但是,生活中的決策都是理性的么?
顯然不是。
否則就不會有雙十一、雙十二什么事兒了。
某喵節 (圖源網絡)
| 憤怒機制
沖動是魔鬼,但沖動也會讓角色更有血肉。
所以,我添加了一個憤怒機制,來模擬這種情緒上的沖動。
試想一下你被招惹急了會做什么?氣哭了?確實,有時候會這樣。但是更多的時候,你會想把對方胖揍一頓來渲泄這種憤怒。
因此,憤怒機制在系統中起到的作用就是強化傷害輸出的決策。
憤怒與策略行為的關系
那么憤怒如何被積累呢?這里使用的設定是:當一個單位受到攻擊后,會增加憤怒值;同時,單位每回合行動后,會降低一些憤怒值。
| 差異性角色
綜上所述,當我們在創造AI時,可以通過調整上述三者策略的比例,來塑造出有差異性的角色。
比如:一個制造仇恨策略比例較高的坦克,和一個造成傷害策略比例較高的坦克,它們在一場戰斗中的表現可能是:前者更愿意保護隊友,而后者則更喜歡追著對方揍。
那么哪種更好呢?
我覺得都很好,這就好比生物多樣性,如果地球上只有人類,那我們的生活該多么的枯燥乏味,甚至無法生存。
所以我們要保護生態環境,愛護我們共同的家園。
世界自然基金會 (圖源網絡)
| AI系統的設計
其實,這個AI系統的設計非常的簡單,我們拆開來看。
◇ 戰斗行為系統(BattleBehaviourSystem)
每一個參與戰斗的單位,都有一個戰斗行為系統。
戰斗單位通過這個行為系統,來決定下一步的行動,比如朝哪移動、向誰發動攻擊、或者恢復誰的生命值等。
但是戰斗行為系統本身并沒有什么計算能力,它只是組織了一個信息環境,真正處理信息、產生具有參考意義信息的家伙,是系統裝配的戰斗行為計算芯片。
◇ 戰斗行為計算芯片(BattleBehaviourChip)
如果你看過《機器貓》,也許還記得在有一集里他拿出了一個“能力磁帶”,只要把這個磁帶插到身體里,你就會掌握一種能力,比如秒變棒球手、摔跤手、哲學家等等。
陪伴成長的藍胖子 (圖源網絡)
戰斗行為計算芯片跟這個很像,如果一個行為系統裝配了某種芯片;那么當這個單位需要決策下一步行動時,芯片就會結合系統所提供的信息環境,為其列出所有可行的行為,并且為它們打分。
當然,一個行為系統可能同時裝配多種不同種類的芯片。
◇ 行為對象(BehaviourItem)
行為對象就是芯片計算出的行為信息的載體,它記錄了這個行為針對的具體目標,以及行為的類型(傷害、嘲諷、治療)等。
◇ 行為調節器(Adjustor)
有時候我們需要微調行為對象中的得分。比如,我們得到了傷害芯片為我們計算出每個目標的得分,但是在做決策前,某個行為調節器忽然想提醒我們應該優先照顧下對方的治療,那么它就會適當調高對這個治療的行為對象的得分,同時調低對其他角色的行為對象的得分。
當所有調節器工作完畢后,系統將會根據這些待決定的行為對象,制定決策對象。
◇ 決策對象(DecisionItem)
制定決策是一個計算具體方案的過程,比如移動到哪個格子,是待命還是使用哪個技能;而決策對象記錄了這些計算的結果,戰斗單位最終根據這個結果,來完成一次行動。
我們可以通過下圖更直觀的了解行為系統的工作流程。
行為系統工作流
以上就是戰斗行為系統的簡單介紹,那接下來我們思考一個問題:如何驗證系統的有效性;或者,當我們調整了用于驅動行為的數值,如何直觀的看到反饋。
| 對結果進行分析
事實上,我們可以在每次調整完數值后,買二手手機靚號平臺安排一些AI加入戰場進行實際作戰。
通過觀察他們在戰斗中的表現;以及,分析每個單位在決策時輸出的Log,可以在一定程度上達到檢驗系統有效性的目的。
一個戰斗單位行動前各行為的得分
但是,這并不是一個好的方法。因為調整數值只是修改了產生決策的范圍;而AI在決策上的變化,是很難在一兩次的戰斗中,通過觀察過程捕捉到的。
下面,我們就嘗試通過對戰斗結果進行數據分析,捕捉數值調整后的反饋信息,來驗證系統的有效性。
首先介紹一下測試環境,創建兩只配置完全相同的隊伍(Team_1和Team_2)。每隊分別配備一名坦克,一名治療及一名輸出。
兩只隊伍的角色配置以及角色關鍵數值
角色所裝配的技能
為了盡量抵消行動次序及出生位置可能對結果帶來的影響,我們采用每場交換優先行動權,以及全員、全地圖隨機初始位置的方式,進行500場自動戰斗。
自動戰斗的邏輯我們之前已經完成了,所以這個過程是很快的。
500場自動戰斗計算
500場自動戰斗后,雙方的獲勝情況
可以看出,在同樣的隊伍配置下,雙方的勝率是很接近的。
接下來,我們調整一些AI的參數,嘗試模擬一些特殊類型(個性)的戰斗角色,看看戰斗系統會給我們帶來怎樣的反饋。
◇ 靠譜的坦克
增加Team_1坦克的嘲諷策略比例,再次對戰500場后,與調整前的戰斗結果進行對比。
提高了嘲諷芯片的決策系數占比
Team_1坦克使用技能的對比
輸出傷害及承受傷害的對比
雙方獲勝情況對比
Team_1角色場均死亡次數對比
?
可以看出:
坦克使用傷害技能的頻次降低,使用仇恨技能的頻次增加,輸出絕對值及輸出占比減小。
但這提高了隊伍的整體勝率。
原因可推測為,坦克更好的保護了輸出及治療,減少了他們受到攻擊的機會及死亡次數,增加了他們輸出傷害和治療的時間,進而影響了整體勝率。
◇ 終結者
為Team_1的近戰Dps的傷害芯片增加殺手調節器,使其成為“終結者”,他(她)會優先考慮攻擊瀕死目標。再次對戰500場后,與調整前的戰斗結果進行對比。
輸出傷害的對比
?
場均擊殺數量的對比
?
雙方獲勝情況對比
可以看出:
由于屬性和所使用的技能都沒有變化,所以終結者的輸出傷害變動很小;但是他的擊殺數量明顯增加(搶人頭)。
盡管隊伍勝率增加了,但是隊友都很討厭他。
◇ 治療壓制
為Team_1的近戰Dps所擁有的傷害芯片增加了職業權重調節器,并設置為治療壓制模式。從此,他莫名其妙的對敵方的治療產生了難以言喻的奇妙情感,并一直重點照顧。
?
職業權重調節器的設置
?
Team_2接受治療對比
?
Team_2 治療承受傷害的來源及擊殺來源的對比
?
雙方獲勝情況對比
可以看出:
治療被對方輸出特殊照顧,直接減少了她的治療總量;而且由于自身不斷遭受攻擊,治療把技能更多的用在了自己身上,無暇顧及其他隊友,進而降低了整體勝率。
◇ 職業保鏢
Team_2的坦克會優先保護己方治療,只要看到她被揍,瞬間寵妻狂魔附體。
?
Team_2勝場存活率及剩余血量對比
?
雙方獲勝情況對比
?
Team_2接受治療情況對比
可以看出:
Team_2的治療得到更多保護,產生的治療量增加,勝場存活率提升,提高了整體戰斗力。
?
《保鏢》海報 (圖源網絡)
?
后來在一次線下聚會時,坦克發現這個“治療妹子”居然是個漢子...
◇ 職業殺手 vs 職業保鏢
Team_1的近戰Dps為治療壓制 + 終結者,Team_2的坦克為治療職業保鏢。
結果…
你猜。
?
《王牌保鏢》海報 (圖源網絡)
?
?
| 寫在最后
至此,調整AI系統的決策方式篇就介紹到這了。
如你所見,本篇所展示的例子,都是單因素實驗;而且角色類型、技能、數值結構都非常簡單。對比那些態度認真、具有復雜技能、數值等設計的游戲,可能不太具有說服力。
但本篇想要做的僅是對“用數值影響AI決策”的一種嘗試,而且這種影響是可以在后期的數據分析中得到反饋的,從這點上講,目的已經達到了。
下一篇將會對AI系統的設計做一個簡單的總結。
最后,需要指出的是,前面提到的《機器貓》,后來已經改名為《哆啦A夢》了。
愿不忘初心。
下回見。
總結
以上是生活随笔為你收集整理的从零点五开始用Unity做半个2D战棋小游戏(九)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零点五开始用Unity做半个2D战棋小
- 下一篇: 从零点五开始用Unity做半个2D战棋小