遊戲伺服器AI 之行為樹(基於behavior designer)(一)
前言
AI應該是MMO類遊戲伺服器的一個主要模組,AI設計的好壞直接影響著遊戲的品質。在現行的AI實現方案中,主要包括下面幾大類
方案一:有限狀態機(FSM)
顧名思義,就是列舉出所有的狀態,根據不同的狀態去處理相應的邏輯
例如遊戲中的一般的小怪的AI:
- 沒有敵人的時候就執行巡邏動作
- 發現敵人就攻擊敵人
- 攻擊距離不夠則追擊
- 超出最大的追擊距離則返回活動範圍繼續執行待機巡邏
在狀態機的世界裡,我們首先羅列出怪的全部的狀態,分別是待機巡邏、攻擊、追擊、返回活動範圍這麼四個狀態,虛擬碼如下所示:
switch(status)
{
case IdleStatus:
{
if(find_enemy)
{
SetStatus(AttackStatus);
}
else
{
do_idle();
}
break;
}
case AttackStatus:
{
if(short_distance)
{
SetStatus(PursueStatus);
}
else
{
do_attack();
}
break;
}
case PursueStatus:
{
if(enough_distance)
{
SetStatus(AttackStatus);
}
else if(exceed_max_pursue_distance)
{
SetStatus(BackStatus);
}
else
{
do_pursue();
}
break;
}
case BackStatus:
{
if(readch_point)
{
SetStatus(IdleStatus);
}
else
{
do_back();
}
break;
}
}
上面的程式碼大概就是一般的狀態機的寫法,優點很明顯就是邏輯比較清楚,基本上是按照我們正常的思維來的。缺點也很明顯,一旦狀態過多,擴充套件性是個很大的問題。就以這個例子為例,當我們再加上血量低於多少的時候逃跑,逃跑到安全區域後回血再返回原始的活動範圍,或者是待機的動作不光是巡邏,還會有機率地觸發張望,睡覺等動作,你會發現你的狀態機越寫越複雜。所以當你的AI比較簡單,狀態較少的時候可以用狀態機,一旦AI狀態過多就要考慮用其他方案了,比如說:行為樹(下面會詳細講到)
方案二: 分層狀態機(HFSM)
分層狀態從字面上的意思也很好理解,當AI的狀態比較多的時候,我們可以對AI的狀態進行分類,每一個大類裡面就是一個小的狀態機的。
以剛才的例子為例:待機的狀態可能不止是巡邏,還會有坐著、趴著、睡覺等狀態,這時候可以把待機作為最外層的一個大狀態,用於最外層的switch-case。裡面再switch-case各個小的狀態。這種類似於軟體設計的分層概念,雖然降低了狀態過多引起的程式碼的複雜度,但擴充套件性還是有所限制。程式碼我就不寫了
方案三:行為樹(behavior tree)
從名字上看,行為樹它是一種樹結構。它具有樹的所有特性,有根節點,父節點,孩子節點,葉子節點,無環性。行為樹的執行原理就是:每一幀都從根節點開始執行
可能初次聽說這個大家可能首先想到的就是效能的問題,每一幀都從頭來,那效能是不是很低。誠然,相比於狀態機,行為樹的效能會有所降低,但是帶來的擴充套件性和可維護性確是非常高的,而且一旦行為樹結構編寫完成,後續的AI工作只需要交給策劃來編輯配置,程式碼框架不會有任何改動,對於我們開發者來說只需要增加獨立的節點而已。後面我會介紹一種很方便的行為樹編輯軟體:behavior designer,它的視覺化效果做的比較好,而且也能很方便地匯出行為樹的配置檔案。
針對效能問題:在行為樹的節點設計中,我們也可以根據具體的情況,通過一些手段來優化效率。後面的章節我會分享在行為樹編寫的過程中遇到的問題和難點
本章完,待續~~~
可能初次聽說這個大家可能首先想到的就是效能的問題,每一幀都從頭來,那效能是不是很低。誠然,相比於狀態機,行為樹的效能會有所降低,但是帶來的擴充套件性和可維護性確是非常高的,而且一旦行為樹結構編寫完成,後續的AI工作只需要交給策劃來編輯配置,程式碼框架不會有任何改動,對於我們開發者來說只需要增加獨立的節點而已。後面我會介紹一種很方便的行為樹編輯軟體:behavior designer,它的視覺化效果做的比較好,而且也能很方便地匯出行為樹的配置檔案。
針對效能問題:在行為樹的節點設計中,我們也可以根據具體的情況,通過一些手段來優化效率。後面的章節我會分享在行為樹編寫的過程中遇到的問題和難點
本章完,待續~~~
下一章:行為樹節點型別介紹
相關文章
- UE4藍圖AI角色製作(六)之行為樹AI
- 遊戲AI之決策結構—行為樹遊戲AI
- AI乾貨(一):為什麼說基於機器學習的AI預測更智慧?AI機器學習
- AI 行為樹的工作原理AI
- 基於樹莓派的內網穿透Web伺服器搭建樹莓派內網穿透Web伺服器
- 第 1 天|基於 AI 進行遊戲開發:5 天建立一個農場遊戲!AI遊戲開發
- 怪物ai與行為樹設計AI
- 一個關於遊戲AI不太野的野望遊戲AI
- 遊戲AI尋路——八叉樹+A*尋路遊戲AI
- AI生成遊戲中基於物理的渲染(PBR)貼圖探索AI遊戲
- SQL Server資料庫基礎之行資料轉換為列資料SQLServer資料庫
- 為什麼說基於機器學習的AI預測更智慧?機器學習AI
- 關於線段樹基礎
- 設計模式分類之行為型模式設計模式
- 基於WebSocket的modbus通訊(一)- 伺服器Web伺服器
- 蘋果為什麼這麼紅?——美國之行總結短評之一蘋果
- 基於樹莓派的叢集實驗(一)--spark on yarn樹莓派SparkYarn
- 製作 2D 素材|基於 AI 5 天建立一個農場遊戲,第 4 天AI遊戲
- 庫車巴依仔湖之行(一)
- react-native踩坑之行(一)React
- WCF擴充套件:行為擴充套件Behavior Extension套件
- 矯情的C++——不明確行為(undefined behavior)C++Undefined
- 如何將樹莓派配置為列印伺服器樹莓派伺服器
- Material Design 之 Behavior 的使用和自定義 BehaviorMaterial Design
- 基於 Tire 樹的敏感詞檢測
- 基於Vue+element-ui 的Table樹VueUI
- 基於樹莓派部署 code-server樹莓派Server
- vue基於Element構建自定義樹Vue
- 基於 iView 的樹選擇器元件View元件
- 基於jenkins搭建一個持續整合伺服器Jenkins伺服器
- 基於ReAct機制的AI AgentReactAI
- 支援中文的基於詞為基本粒度的字首樹(prefix trie)python實現Python
- 惡意程式碼分析之行為分析及樣本收集
- WPF MenuItem behavior MVVMUIMVVM
- 基於TcpListener的web伺服器TCPWeb伺服器
- 基於 BaGet 搭建 Nuget 伺服器伺服器
- 基於tinyproxy搭建代理伺服器伺服器
- 基於Vue的組織架構樹元件Vue架構元件