从零点五开始用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的決策系統,讓它的表現更具期待性,使戰斗變得更加有趣。
此外,我邀請了我的好友Aillieo,拜托他按照自己的方式也設計一個AI系統。
因此,我會在第三篇介紹他所設計的AI系統,并對這三篇做一個整體的總結。
| 非常簡單的AI系統
個人以為,有意思的AI系統可以簡單的定義為:
讓人覺得符合邏輯,卻又在一定程度上超出了預期。如何實現一個非常簡單的AI系統呢?為了讓問題變得再簡單些,我將AI的行為拆解成固定的三個步驟:
1、確定攻擊目標;
2、向攻擊目標移動;
3、使用技能。
| 確定攻擊目標
將”合理“的目標設定為攻擊目標,是件并不太容易的事情。
這里我且不談那些優秀的游戲是怎么做的,因為我也不知道。只說說我目前所使用的方法:仇恨系統。
AI使用仇恨列表確定攻擊目標
每當一個戰斗單位在戰場中被敵人攻擊時,他就會偷偷的在自己的小本本里記下攻擊者的名字,以及他們的罪行。
當輪到他行動時,他就會掏出自己攥了很久的小本本,按照之前它們揍自己的程度進行降序排列,然后按照這個名單,判斷自己反擊的可能性。
這里,沒有反擊的可能性,指的是:如果買二手手機靚號目標已經被人包圍,自己卻又是一個近戰角色無法靠近,那他就會嘟囔著“哼饒你一條狗命”,然后繼續看下一個人。
直到確定這個家伙可以被自己攻擊到,他就會合上小本本,把他的名字刻上自己的心頭,然后準備開始下一個步驟:向他移動。
| 向目標單位移動
向目標移動就很簡單了,通過A-Star算法找到移動路徑后,行動即可。
確定目標后沿路徑移動
但是這里有一個小問題:應該選擇哪個格子作為移動的終點呢?
特別是當攻擊者是某些遠程攻擊單位,比如游戲中常見的魔法師或者弓箭手,每次都走到目標旁邊去攻擊,感覺上就有點像“送外賣”。
其實解決方法也很簡單,在導航時仍然選擇目標所在位置做為導航終點,但在距離終點一定距離時,停止導航并返回導航路徑即可。這個停止距離,就是遠程攻擊單位的射程,或者手動設定的某個值。
射程為2的小紅,導航停止在距離小藍兩個單位的格子上
這與“真正的愛情,能跨越一切障礙”是一個道理。
當然,如果這個人兒并不在天邊,而在觸手可及的地方,那他根本就不用移動,直接進入下面的環節吧。
| 對目標使用技能
光說,不練,假把式。
好容易走到了他(她)的身邊,總得有所表示吧?
試想一個場景:你很喜歡一個女孩兒,在表白的關鍵時刻,你有一百種表達方法,但你卻只能選擇一種,究竟哪種才是最有效的呢?
如果是真實的生活,答案很簡單:看運氣。
但是游戲則不同,你可以用S/L大法(存、讀檔大法)來不斷重試,直到找出效果最好的那一種!
決策將要使用的技能也可以是一樣的。
這里我且不談那些優秀的游戲是怎么做的,因為我也不知道。只說說我目前所使用的方法:簡單的計算所有可用技能的釋放回報。
計算技能得分并確定所使用的技能
計算技能釋放得分的公式異常復雜,由于這并不是一篇學術性論文,因此這里不做詳細的解釋和說明,只把公式列出即可:
技能釋放得分 = 技能造成的總傷害 ÷ 技能消耗的能量值
也就眾所周知的:
天啊,好麻煩。
但是,在得到了按照釋放得分降序排列的可用技能列表后,帶著何種的心情、用著怎樣的姿勢、使用哪個技能的問題,就變得十分容易了。
可能我們只需要注意下遠程范圍技能的釋放點選擇問題即可。
釋放影響半徑為2的遠程范圍技能
對于遠程范圍技能,我們當然可以使用一些方法,找到覆蓋最多目標的釋放點。
但為了省事兒,我這里是這么處理的:當目標超過技能釋放距離時,嘗試找到釋放技能時,可以覆蓋到目標單位的點,然后從這里隨便選一個即可。當然,如果目標本身就在技能釋放半徑內,就選它為釋放中心了。
紅色區域為覆蓋半徑為2的技能在釋放時,可以傷害到藍色格子的釋放點
| 能量值
當然,為了幫助AI計算出哪個技能的釋放得分更高,我為每個戰斗單位都增加了一個能量值的屬性(你也可以認為它是魔法值);為每個技能增加了釋放的能量消耗;同時還為游戲增加了每次行動時恢復10個單位能量的設定。但是由于這些邏輯都很簡單,這里就不贅述了。
最后,我們來回顧下整個行動流程吧:
1、打誰;
2、去哪打;
3、怎么打。
完整的AI行動流程
| 寫在最后
至此,建立超級簡單的AI系統篇就介紹到這了。如你所見,這里只是實現了非常簡單的AI行動邏輯,并沒有體現出各種類型AI的不同,我們下期將嘗試著解決這個問題。
但是目前還沒想好怎么做,而且最近又很忙,因此下回可能會拖得久一些吧。
愿不忘初心。
下回見。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的从零点五开始用Unity做半个2D战棋小游戏(八)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零点五开始用Unity做半个2D战棋小
- 下一篇: 从零点五开始用Unity做半个2D战棋小