遊戲伺服器AI 之行為樹(基於behavior designer)(一)

fm_vae發表於2018-01-21

前言

AI應該是MMO類遊戲伺服器的一個主要模組,AI設計的好壞直接影響著遊戲的品質。在現行的AI實現方案中,主要包括下面幾大類

方案一:有限狀態機(FSM)
顧名思義,就是列舉出所有的狀態,根據不同的狀態去處理相應的邏輯

例如遊戲中的一般的小怪的AI:
  1. 沒有敵人的時候就執行巡邏動作
  2. 發現敵人就攻擊敵人
  3. 攻擊距離不夠則追擊
  4. 超出最大的追擊距離則返回活動範圍繼續執行待機巡邏
在狀態機的世界裡,我們首先羅列出怪的全部的狀態,分別是待機巡邏、攻擊、追擊、返回活動範圍這麼四個狀態,虛擬碼如下所示:
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,它的視覺化效果做的比較好,而且也能很方便地匯出行為樹的配置檔案。


針對效能問題:在行為樹的節點設計中,我們也可以根據具體的情況,通過一些手段來優化效率。後面的章節我會分享在行為樹編寫的過程中遇到的問題和難點


本章完,待續~~~

下一章:行為樹節點型別介紹



相關文章