ARPG遊戲的AI系統淺析
前言
自我介紹一下,我的網名叫「柯哀的眼」圈子裡喜歡叫我」愛神」
我在做獨立遊戲的途中遇到了一些問題,正巧今天忙裡偷閒,就把所學,所悟的東西和大家分享一下。在講之前我先給大家安利一個論壇和一本書,都是關於遊戲人工智慧的介紹。
http://aigamedev.com/遊戲人工智慧編程案例精粹(美)MAT BUCKLAND著
好啦,我們從此開始關於遊戲AI的一段探索之旅。
我用的是虛幻4引擎,但是我覺得所有引擎都可能會用到這些知識,它應該算為一種思路,而不應該局限在引擎之中。由於我本身也還沒有實現出來,所以如果有紕漏還請大家多提意見,共同進步~
一、必要的數學知識與物理知識
二、關於狀態機與行為樹的討論
三、初識MVC架構
四、讓AI走起來
五、技能系統的設計
六、無縫動畫的對接技巧
七、行為樹的實踐與探索
八、探索數值計算與BUFF系統
九、設計數值部分與銜接的各種套路
第一章:必要的數學知識與物理知識
考慮到遊戲中AI所需要的功能,我們先進行一下知識的匯總,在清理思路的同時並確立信心。其實我們需要的知識並不多,在掌握了需要學習的方向以後再去系統的學習,我相信效率將會是翻倍的。
初中數學的三角形知識,包括勾股定理、三角函數的初級部分。
高中數學的平面向量知識,向量的運算,三角函數的高級部分,反三角函數。
初中物理的單位及力學知識,牛頓定律,各種速度和加速度的計算。
高中物理的力學知識,摩擦力,速度與速率,曲線運動,動量與衝量,引力。
俗話說得好,出來混總是要還的,這些知識當你真正需要的時候才能讓你感受到先人的偉大。所以嘛,好好學習天天向上,長大以後做遊戲~
第二章:關於狀態機與行為樹的討論
我們知道,實現AI的方式有很多種,狀態機與行為樹只是其中比較出名,比較經典的,能讓大家都認可的兩種實現方式。
他們的共同點就是都會想辦法用一種方式來概括人類的行為。用更加通俗的一句話就是說,他們都在盡量的去模仿人類。
有了前面的基礎,我們就可以正式開始認識這兩個偉大的智慧結晶。他們就好像是AI的哲學,引領者一個又一個的AI在黑暗中不停地摸索,直到出世,優雅的展現在玩家的眼前。
狀態機就像一條生產線,每一個狀態就像一個生產的工序。在這個生產線運行的時候,每一個工序上都會有通向其他工序的傳送帶。他們有可能只執行了一次,也有可能會一直循環執行。
知道最後完成所有的工序。
行為樹就像一個創業公司,裡面都是一些剛畢業的熱血大學生。當公司有任務的時候,每個員工都會自檢,心中想著,我能不能搞定這份任務。如果能搞定的話就由他來做這件事,而不能搞定的同事會選擇沉默。通常最後只會有一個人能勝任,但也有同時兩個人一起工作的時候。而且當公司新招進來人的時候也能快速的融入這個集體。
說道這裡,相信大家已經明白了這兩個「工具」的著重點分別是什麼。如果任務很複雜的時候建議用行為樹,那樣會有條不紊。
此時應該會有人提出疑問,既然說行為樹適合複雜的AI邏輯的表現,那麼狀態機的存在是不是顯得很低下了呢?
提到這這,我們就得再說一下狀態機的拓展了,狀態機目前分為兩個比較常用的變種。有限狀態機和分層狀態機。
有限狀態機就是一個生產線,各個狀態之間的傳送帶很繁瑣。而分層狀態機則是把一些比較重要的部分寫作子狀態機。每當需要處理這個大任務時都會進入到這個子狀態機,這樣雖然隔絕了一些傳送帶,但是分工更加明確了,也更有助於理清思路,拓展功能了。
這裡我們先暫且講到這裡,關於行為樹與狀態機更加深入的知識會在後面詳細的進行講解。
第三章:初識MVC架構
MVC是編寫程序的一個很經典的程序架構。為什麼要將這個呢,主要是因為當我不了解架構的時候雖然也能做出一些東西,但是由於太過風流不羈,寫法太浪。所以最後一般都超出了自己的掌控能力,而框架的作用就是限制你,讓你盡量寫的規範,易懂。它負責支撐起整個系統。讓你可以更加輕鬆的專註於某個功能。而不是顧此失彼,邏輯越來越混亂。
明白了框架的好處,現在我們來了解一下框架中最經典的MVC架構,這裡我多說一句,程序經典架構有很多種,各個框架都各有優點與缺點。在使用任何一個框架之前都要深刻的知道這件事。按照自己的需求在合理的選擇框架是最明智的選擇。
我為什麼選擇了MVC架構呢?MVC架構的優點是分層,每個層之間聯繫很少(低耦合),所以你排查錯誤的時候就不用顧慮到會不會牽一髮而動全身。
它還有一個更顯著的優點,當遊戲的數據有多個表現形式的時候,可以寫好幾套表現的形式。這不會影響到你的核心部分。通常遊戲存在動態數據的界面都要使用到這個MVC架構。
MVC是三個英文單詞的縮寫,分別是模型、『視圖』、『控制器』的意思。
模型,是數據的意思,一個系統所有用到的數據都存在這裡面。
視圖,是把數據顯示在屏幕上的意思,如何交互,如何顯示,都是視圖的工作。
控制器,是運用數據進行處理,它都是邏輯,專門處理數據得到結果,然後傳遞給視圖,以供顯示。
它們也有個好聽的名字。數據層,表現層(應用層),業務層(邏輯層)
第一次接觸也許你會的很簡單,但是如果你真正的嚴格按照上述的進行劃分功能就不是那麼簡單的事情了,初次分功能會有很多迷茫的問題,需要勤查資料。多動腦去想,它就像一個指導性綱領。當你真正貫徹它的時候才會發覺它的偉大。
第四章:讓AI走起來
說了這麼多,我們開始探究AI的一些東西。
動作類遊戲一般都是會走位的。如果一個敵人不會放任何技能,那麼它一定不會是傻傻的走向玩家然後站立不動的。它肯定會不斷的走位,來凸顯自己是一個有智慧的AI而不是一個傻瓜AI。
走位可以凸顯出AI的個性,所以每一個類型的敵人的走位都是不大相同的,有可能是節奏上的差異,有可能是距離上的差異。下面我簡單地概括了一些走位的動作,僅供參考。
小圈遊走、中圈遊走、大圈遊走、稍向後退、中向後退、大向後退、稍向前進、中向前進、大向前進、向左走、左跑、右跑、向右走、左前閃、右前閃、圓形走、梯形走、八字走、
蛇形走。
這樣,各個動作之間隨機或手動銜接,產生的變化會有很多種,你完全可以憑藉這些東西做出一個懂得走位的顯得充滿挑戰性的敵人出來。
這裡我還要補充一下。為什麼怪物放招的時候大多都恰到好處的命中玩家,你不能為了釋放一個技能去專門的走向玩家。如果你為了專門釋放一個技能而去走向特定的位置時會顯得不是那麼友好。
正確的思路是AI懂得走位,在走位時不停的判斷技能播放條件,然後按照技能播放的優先順序來進行播放,這樣,每次播放技能時怪物都會恰到好處的待在那個適合的位置,從而命中玩家。
理論上,如果怪物釋放一個技能,玩家如果不躲的話是絕對會被命中的。但是如果我們刻意的讓它空放技能也是允許的,比如AI離得玩家很遠,卻釋放了一個近戰的技能。
但是這種需求還是在少數。如果空放的技能太多的話就不能體現出怪物的靈性,反而顯得怪物很傻。
關於實現方面我想放在動畫部分里講,目前只是理解這個概念,不要陷入思想的誤區。
第五章:技能系統的設計
在設計技能系統之前我有必要再複習一下之前講過的MVC架構和行為樹。
虛幻4的行為樹有一個黑板的概念,黑板存放的是所有這個行為樹將會用到的變數。那麼為什麼要有黑板這個東西呢?它存在的意義是什麼呢?
其實如果你細心的話就能發現,黑板與之前的MVC架構的數據層其實是一個東西。
黑板就好像上面寫了很多東西,行為樹的各個行為就好像同學們,學生根據黑板上的東西再學習,但是一般情況下很少對黑板進行改動。所以行為樹與黑板的關係就有一些MVC架構的影子。這樣分出層次的目的就是要各個學生之間的聯繫盡量少,只有這樣才能保證框架的穩定,讓他們互相之間不會干擾。
拋開引擎,如果我們不用行為樹實現也是得單獨的分出數據部分的。比如我下面要設計的技能系統。
雖然虛幻4的行為樹很強大,但還是有很多缺陷,你需要自己寫一些系統來保證整個AI系統的完整性和便利性。
首先,我們先創建了一個結構體,裡面存放的是技能需要的各種數據,如:
技能數據 = [ID,名字,是否處於冷卻,冷卻時間,動畫蒙太奇,聲音,播放優先順序,初始化BUFF,。。。。]
等等。。
之後我們創建了一個技能控制器,專門用來管理,播放技能。這對應著MVC架構中的業務層。
技能數據作為一個結構體,可以用表填寫,並初始化進每一個怪物中,也可以直接添加進怪物的類里,每當新添加一個技能時,找到相應的地方手動的填寫即可。這便是數據層
這樣MVC架構中的三個要素我們已經用到兩個了,還缺最後一個表現層。
而這個表現層就是專門用來播放動畫的地方,在虛幻引擎中這個地方叫做動畫藍圖,在其他引擎中應該也有類似的地方。
而行為樹和技能系統相互關聯,這裡我們只負責技能的播放與冷卻管理。而技能順序則靜態的寫在行為樹裡面,這樣能使行為樹的優點最大化的體現出來,(盡量靜態的寫行為樹)
說道冷卻,我也有一些要講的東西,虛幻的計時器很強大,但是用起來還是有很多不便的地方。一開始我設想的是每個技能都有一個計時器,但是在初始化的時候遇到了BUG所以又換了一種新的思路。
只用一個計時器進行全局計時,每0.1秒進行累加一個浮點變數,技能的CD屬性加上當前的時間值,會得到一個未來的時間值。然後循環判斷這些技能是否達到了冷卻的臨界點。
這樣的好處是思路清晰,而且為了使浮點值不會太大,所以在沒有技能讀冷卻時這個計時器將會被暫停,浮點值也會被歸0。(這裡是具體的實現思路,看不懂也不用擔心,能意會最好)
其實技能控制器也就是這兩個功能,播放技能和冷卻,其他的東西如果有需要以後也可以很方便的加進去。
第六章:無縫動畫的對接技巧
在這裡,我們需要討論一下無縫動畫的實現技術。在虛幻引擎中我們可以通過動畫藍圖來綜合的管理切換角色動畫,也可以通過混合空間進行動畫的混合,也可以通過動畫蒙太奇與插槽進行混合。
一般的,我們的技能全是用蒙太奇來播放的,這種動畫格式可以輕鬆地在任何幀的位置上添加事件,添加粒子特效,添加音效。如果再稍加調整,那將是一個不錯的技能了。
虛幻引擎幫我們實現了大部分基礎功能,有很多參數其實都很細緻。
通常的,我們需要角色行走到跑步之間的切換。在這個基礎上我們可以混合左右方向的動畫。
我們還需要一些扭頭看的動畫,最終將會混合成允許各種角度的頭部扭轉。
在這個階段我們需要大量繁瑣的工序,需要程序與動畫師之間耐心的交流,包括前面所說的角色的走位也會用到這些混合動畫。
並且還要根據角色的速度與動畫之間再仔細的調整,我們有兩種實現方案,一種是跟骨骼運動,由動畫師做出位移動畫,另一種是原地動畫,但是需要用程序控制角色移動。第二種雖然不太好實現,但是動畫的復用性比較可觀。
通常,如果我們不太在意這些動畫上的小細節的話就用動畫藍圖來寫出走路的混合,然後讓技能系統直接播放蒙太奇即可,但是我們也有辦法修正這些小問題嗎,只要耐心即可。
蒙太奇動畫可以添加自定義的事件,我們在動畫開始的時候和結束的時候都添加一個事件,代表這個動畫的開始與結束,這樣的話我們就可以更加自由的對動畫的銜接進行控制了,如果動畫播放的不盡人意,就可以手動拖動事件所處幀的位置,依靠這種方法做到對動畫的把控。
值得注意的是,有些混合的動畫再加上其他動畫時可能會有閃動,這就是因為動畫的長度不一致造成的,虛幻引擎也給出了相應的解決方案,同步組,這個可以下載官方4.19的最新帕拉貢的資源,裡面用到了這一技術,很有研究價值。
我們有時會遇到帶位移類型的技能,我們同樣可以通過動畫事件來用程序控制曲線,有時候我們可以計算出它的跳躍速度,角度,高度,等等。
這些東西就會用到很多物理方面的知識,為了調出優雅的效果,這點付出是值得的。
第七章:行為樹的實踐與探索
在做行為樹的初期階段,我曾經嘗試過這種方案。
我打算遊戲里寫一個行為樹,來讓大多數AI通用,後來我發現要實現出來幾乎是不可能的,因為它本身就是一個十分抽象的東西,因為每個怪物都要有自己的個性,所以幾乎不可能寫的很靜態,大多時候只能寫的很動態,這樣的話就很大程度的放棄了行為樹本身的強大優點。
後來我發現行為樹最好就是每個怪物寫一個行為樹,這樣可以輕鬆地修改,並且除了技能系統的對接以外幾乎沒有和其他地方進行聯繫,所以更能讓行為樹去控制AI,而不是讓其他東西去控制行為樹,由行為樹再去控制AI,那樣的話行為樹毫無自主權,就變成了一棵決策樹。
虛幻引擎自帶的行為樹裡面的功能函數都很簡陋,不過它同時提供了自己創建節點的功能,所以一般來說我們都會自己寫功能節點,並放在行為樹中運行。
如果做了很多同樣的行為樹,可以考慮把一些類似的功能再次進行整合,但是也絕對不能像我一開始那樣,全盤整合,那樣就失去了可以肆意調整,不計後果的權利。並且設計的過程是十分痛苦的。
作為一個動作類角色扮演遊戲,我們攻擊的同時也得考慮到受擊的因素,我們又得去借鑒替他經典的遊戲,在觀察的過程中,我發現了一個硬直的屬性,怪物收到攻擊時會遭到硬直,這樣就可以很好的體現出打擊感,我們在這裡暫時不探討打擊感的問題。我們需要做的就是把每個技能,或技能之間的連續,寫在行為樹裡面,並且總結出一般技能的播放前提。
我們在播放技能的時候需要暗中旋轉AI,朝向目標,這樣,無論玩家怎麼圍著AI繞圈子,AI最終都會近似的朝向玩家,並且盡量讓玩家察覺不到它在暗中旋轉。
我們也可以設計一種旋轉的技能,專門負責某些怪物的旋轉,比如某些大型怪物,這樣的話就不會因旋轉而顯得特別難看。
剛剛,我們說了一下硬直的概念,在硬直的基礎上可以適當的播放一些受擊動畫,或者與玩家互動的動畫來提升最終的受擊效果,並且最後死亡倒地時也可以啟用物理,來模擬各種死相,繼而再次提升感受。
現在我們總結一下,行為樹的各個狀態其實就是怪物技能的各個條件,我們通過技能系統播放技能,通過動畫藍圖來實現出各種受擊的表現。而且我們的行為樹時獨一無二的,當你做好這一步是,你已經可以開始著手設計自己的行為樹了,難點在於設計,有時候甚至會花費很長時間,不要灰心,你需要的只是時間和經驗而已,慢慢來,你也能設計出一個完美的動作遊戲AI出來。
第八章:探索數值計算與BUFF系統
暫略
第九章:設計數值部分與銜接的各種套路
暫略
今天寫了很多,有點寫不動了,等有精力了再回來補充一波~
推薦閱讀:
※技術美術職能概述(Unreal Engine 4)
※真良心大廠EPIC,頁游廣告又有新素材了!
※解讀GDC三個Unreal作品,照片級真實感,實時圖形渲染,塑造下一代遊戲和電影
※我們的UE4項目——PixArk上線了[廣告]
※[UE4]資源非同步載入(Assets Asynchronous Loading)與內存釋放(Free Memory)