怪物ai與行為樹設計

遊資網發表於2020-06-23
說到怪物ai和行為樹,網上有很多文章進行了介紹,很多人可能都有一定的瞭解,但在實際運用過程中又好像有點是似而非。

這裡我們簡單的梳理一下:ai表示的是人工智慧,就是用程式邏輯模擬人的行為。而行為樹是一種程式實現ai的一種方法,策劃可以用行為樹的方式進行ai設計,也可以採用比較常規的狀態機機制進行設計。

怪物ai與行為樹設計

不管用什麼方式進行設計。

策劃本質上要設計的是怪物行為,這些怪物行為能夠針對周圍的環境和玩家行為作出反饋。因此在進行怪物ai設計的時候,最本質的表達就是:

怪物有哪些行為?

行為有哪些前置條件?

舉個例子

移動邏輯:

  • 當警戒範圍內沒有敵方單位時:巡邏
  • 當警戒範圍內出現敵方單位時: 向敵人移動。
  • 當怪物生命值低於500時:逃跑


攻擊邏輯:

  • 當角色進入攻擊範圍進行攻擊。
  • 當怪物血量低於1000時進行瘋狂攻擊攻擊。
  • 當怪物血量高於或等於1000時進行瘋狂攻擊。


很明顯可以看出,上面的這種描述大致描述了這個單位的一些ai特徵,然後我們就可以利用程式中思想來描述我們所要表達的怪物ai,從而補充我們所思考的一些漏洞。在做這個工作之前,我們先抽象怪物有哪些前置條件和行為。

怪物ai與行為樹設計

上面我們提到了警戒卻沒有用戰鬥狀態這個元素。選擇攻擊目標也沒有提到大家熟悉的威脅值這個元素。因為我們的ai需求裡面不需要這樣的元素來進行更復雜的邏輯判斷。因此在抽象前置條件時,並不是把我們印象中知道的一些元素塞進來,而是根據需要制定相關的元素來滿足我們所需要的設定目標。

因此我們得到了我們將這些前置條件和行為進行邏輯整理,就得到了如下的mind圖:

怪物ai與行為樹設計

上圖中因為沒有特殊的移動,因此把移動的執行省略了。

我們可以看到每個特定的條件都能執行到一個確定的行為結果。這是一個非常簡單的ai例子,實際運用過程中的ai行為會因為陣營,技能,地形等因素有許多複雜的判斷。如果按上面的腦圖方法進行程式設計時,可能引入的是一種“狀態機”的機制,就是每間隔一段時間檢查一下當前的狀態,當狀態發生改變時,執行接下來的行為,並且執行後改變狀態。

狀態態機可歸納為4個要素,即現態、條件、動作、次態。這樣的歸納,主要是出於對狀態機的內在因果關係的考慮。“現態”和“條件”是因,“動作”和“次態”是果。詳解如下:

現態:是指當前所處的狀態。

條件:又稱為“事件”,當一個條件被滿足,將會觸發一個動作,或者執行一次狀態的遷移。

動作:條件滿足後執行的動作。動作執行完畢後,可以遷移到新的狀態,也可以仍舊保持原狀態。動作不是必需的,當條件滿足後,也可以不執行任何動作,直接遷移到新狀態。

次態:條件滿足後要遷往的新狀態。“次態”是相對於“現態”而言的,“次態”一旦被啟用,就轉變成新的“現態”了。

這種方式下當元素判斷過於龐大,多個物件同時存在時,無論是這種方式的設計還是對程式邏輯的執行起來了巨大的障礙,為了解決這一障礙於是就提出了行為樹的概念,行為樹(BehaviorTree)是Next-Gen AI提出的一個原型。

它以圖形的形式展現了AI系統的結構,將上述的流程圖整理之後於是得到如下的圖形:

怪物ai與行為樹設計

1)順序節點(Sequence):順序執行子節點,只要它的一個子節點返回false,則整個分支返回false,反之返回true,類似程式中的邏輯與(AND)。

2)選擇節點(Selector): 順序執行子節點,只要它的一個子節點返回true,則整個分支返回true,反之返回false,類似程式中的邏輯或(OR)。

3)條件節點(Condition): 屬於葉子節點(該種節點不允許有任何子節點),用於描述一個條件是否成立。

4)行為節點(Action) : 屬於葉子節點(該種節點不允許有任何子節點),用於描述一個最終執行的動作,一般返回true。

假設當前怪物的生命值為450,警戒範圍內有敵軍,滿足逃跑條件。怪物要執行逃跑行為,首先判斷所有的條件:

  • 警戒範圍內是否有敵軍,是為true,否為false
  • 自身生命值是否高於或等於500,是為true,否為false
  • 自身生命值是否高於或等於1000,是為true,否為false
  • 自身是否正在遭受攻擊,是為true,否為false


根據行為樹的執行規則,則得到逃跑的結果。

從上面的表述我們可以看到,用“狀態機”的機制我們可以更加直觀的看到怪物在什麼條件下執行出什麼行為,但是在判斷條件非常多的時候,會產生許多的狀態跳轉關係,維護成本會比較大,程式執行效率也會相對比較低。而用行為樹的機制,我們比較難直接的看出怪物的具體行為,但是在維護成本和執行效率方面會得到較大的提高。

因此,在設計規模不是特別龐大,修改次數比較少的ai型別時,用一般的狀態機機制即可滿足條件,而在設計複雜,經常需要調整維護的ai時,儘可能的使用行為樹機制。至於策劃是使用行為樹機制還是狀態機機制,個人建議還是從狀態機機制入手,對怪物的行為設定有了足夠的瞭解之後,在設計複雜的ai時慢慢轉向行為樹機制。

但是不管用什麼方式,作為策劃最首先要考慮到的是我們究竟要什麼樣的結果,這些設定能帶來什麼樣的體驗。因此作為怪物ai設計,我們要考慮到的是我們所要的玩法需要什麼樣的怪物行為和前置條件進行支撐,然後再利用狀態機機制或是行為樹機制進行細節的邏輯漏洞補充和方便程式進行實現。

來源:遊戲魂
原地址:https://mp.weixin.qq.com/s/D_g2bviTxHx1bbhiYjF7kg

相關文章