AI。我們的第一印象可能是機器人,現在主要說在游戲中的應用。關於AI的相關文章我們在前面也提到過,詳細請戳這 現代的計算機游戲中已經大量融入了AI元素,平時我們進行游戲時產生的交互都是由AI來完成的。比如在RPG游戲中出現的NPC,實際上就是一個AI的載體,它們有着最常規,以及特定情景的判斷能力與數據處理能力。判斷,也稱為分析。大量的分析,即邏輯。邏輯,即AI.
最形象的例子應該是游戲中具有攻擊能力的怪物,當它們看到玩家時(或者被玩家攻擊)的情況下,怪物可能會在指定范圍或者指定時間段內跟隨玩家並試圖反擊。但當玩家離開怪物的視野范圍或者超過了怪物的跟隨時間,怪物則會自動返回原來的地方。而當玩家下次出現在同一個怪物的視野內時,怪物依然會作出相同的舉動。但這並不能代表怪物具有記憶能力,因為它只能根據簡單的程序去判斷外界發生的特定場景以作出相應的處理。這純粹是基於數字儲存器與狀態機的人工智能。如果我們在此基礎上再進行優化,讓怪物具有記憶能力:再次看到玩家時的怪物將會出現憤怒狀態,並且攻擊能力變得更強,似乎會更加有趣,因為這接近了人類的情緒特征。
行為樹(Behavior Tree)
根據上面所描述的AI載體的特征,假設一個AI載體承載的知識量過於龐大,那就給維護帶來了很大的困擾。只是如果我們要實現較為智能的AI載體,龐大的知識庫和行為特征是必須的。
行為樹(Behavior Tree)是Next-Gen AI提出的一個原型。它以圖形的形式展現了AI系統的結構。如圖(1-1):
以上定義的是普通游戲怪物的基本AI的行為樹。所謂樹,即有根節點,有分支節點,有葉節點。可能大家已經注意到,在圖中行為樹中具有不同特性的節點,並且這些節點似乎是以一定的規則組裝成的一棵樹。
行為樹節點(Behavior Tree Nodes):
·選擇節點(Selector): 順序執行子節點,只要它的一個子節點返回true,則整個分支返回true,反之返回false,類似程序中的邏輯或(OR)。
·順序節點(Sequence) :順序執行子節點,只要它的一個子節點返回false,則整個分支返回false,反之返回true, 類似程序中的邏輯與(AND)。
·條件節點(Condition) : 屬於葉子節點(該種節點不允許有任何子節點),用於描述一個條件是否成立。
·行為節點(Action) : 屬於葉子節點(該種節點不允許有任何子節點),用於描述一個最終執行的動作,一般返回true。
其中選擇節點(Selector), 順序節點均屬於組合節點。組合節點是一個分類概念,並非指一個節點的實例。
上圖行為樹中的怪物擁有[攻擊玩家]、[巡邏]、[自衛]三種行為,這三種行為並非指怪物的最終決策,而是特指怪物可能會從這三個行為中出發。其中[攻擊玩家]可能有兩種方式,其中一個性質為順序節點的[常規攻擊],它必須要滿足三個條件。而另外一個[報復性攻擊],不同的地方在於多了一個條件節點[怪物處於發狂狀態]。
理解各種不同節點所表達的意思,你就會很神奇地發現思路變得很清晰。整棵樹的特征以及邏輯走向,必須要的條件都盡然於眼底。傳統的文字描述AI的方式很不低碳,因為大量的文字並不利於團隊理解策划的思路,但通過行為樹則可以很明確地表達條件與動作之間的關系。
如果說行為樹是統一團隊理解一致性的好方法,那么如何把這個樹實現出來呢?
狀態機(State Machine)
說到狀態機的概念,也許很多程序員都相當熟悉。就拿上面的行為樹來說,僅僅是描述了一個怪物的AI,但其中涉及的狀態可謂不少。在傳統的設計思路中,玩家進入怪物的視野時,怪物的狀態將會馬上發生改變而從主動攻擊玩家。
狀態(State),指的是對象的某種形態,在當前形態下可能會擁有不同的行為和屬性。狀態機(State Machine),指控制對象狀態的管理器。對象的狀態不會無端端改變,它需要在某種條件下才會變換。比如上面定義的行為樹中的[巡邏]行為,它就規定了必須是在怪物視野中找不到目標的情況下才會變更的狀態。一旦有玩家進入了它的視野,它將馬上切換為攻擊狀態。總而言之,狀態會在某個事件觸發之后變更。不同的狀態也有可能決定了對象的不同屬性和行為。
Next-Gen AI的行為樹絕對是個好東西,相信經過上面的介紹大家也對行為樹的特性略知一二。有覺悟的讀者可能已經意識到,既然有了行為樹,那是不是意味着可以做一款輔助工具去把這棵樹生成出來,然后套入一個固定的AI框架,再把游戲邏輯的雛形自動生成?這是完全可以的。如果在行為樹的基礎上再加入腳本的機制,那么游戲AI的實現將會更加靈活、清晰。
Unity中現有的AssetStore中的行為樹插件有: Behavior Designer 、 AI Behavior、 Behaviour Machine Pro
狀態機插件有: Playmaker(應用了狀態機的插件)、很多的AI插件等