天天看點

FSM(狀态機)、HFSM(分層狀态機)、BT(行為樹)

遊戲人工智能AI中最常聽見的就是這三個詞拉:

FSM

這個不用說拉,百度一大堆解釋,

簡單将就是将遊戲AI行為分為一個一個的狀态,狀态與狀态之間的過渡通過事件的觸發來形成。

比如士兵的行為有“巡邏”,“追擊敵人”,“攻擊敵人”,“逃跑”等行為,

響應的事件就有“發現敵人”,“追到敵人”,“敵人逃跑”,“敵人死亡”,“自己血量不足”等。

那麼可以寫成這樣一個狀态機:

1.士兵 “巡邏”,如果 “發現敵人”,那麼,“追擊敵人”

2.士兵 “追擊敵人”, 如果 “追到敵人”, 那麼,“攻擊敵人”

3.士兵 “追擊敵人”, 如果 “敵人死亡”, 那麼,繼續 “巡邏”

4.士兵 “攻擊敵人”, 如果 “敵人死亡”, 那麼,繼續 “巡邏”

5.士兵 “攻擊敵人”, 如果 “血量不足”, 那麼,“逃跑”

其中,士兵就是這個FSM的執行者,紅色的就是狀态,藍色的就是事件,

整個狀态機的行為可以總結為:

目前狀态=>是否滿足條件1,如果是,則跳轉到對應狀态

  否則=>是否滿足條件2,如果是,則跳轉到對應狀态

由此可看出,狀态機是一種“事件觸發型”AI,就是隻有事件的觸發才會發生引起狀态的變化。

HFSM

簡單來說,就是FSM當狀态太多的時候,不好維護,于是将狀态分類,抽離出來,将同類型的

狀态做為一個狀态機,然後再做一個大的狀态機,來維護這些子狀态機。

舉個決策小狗行為的例子:

我們對小狗定義了有很多行為,比如跑,吃飯,睡覺,咆哮,撒嬌,搖尾巴等等,如果每個行為都是一個狀态,

用正常狀态機的話,我們就需要在這些狀态間定義跳轉,比如在“跑”的狀态下,如果累了,那就跳轉到“睡覺”狀态,

再如,在“撒嬌”的狀态下,如果感到有威脅,那就跳轉到“咆哮”的狀态等等,我們會考量每一個狀态間的關系,定

義所有的跳轉連結,建立這樣一個狀态機。如果用階層化的狀态機的話,我們就先會把這些行為“分類”,把幾個小狀

态歸并到一個狀态裡,然後再定義高層狀态和高層狀态中内部小狀态的跳轉連結。

其實階層化狀态機從某種程度上,就是限制了狀态機的跳轉,而且狀态内的狀态是不需要關心外部狀态的跳轉的,

這樣也做到了無關狀态間的隔離,比如對于小狗來說,我們可以把小狗的狀态先定義為疲勞,開心,憤怒,然後這些

狀态裡再定義小狀态,比如在開心的狀态中,有撒橋,搖尾巴等小狀态,這樣我們在外部隻需要關心三個狀态的跳

轉(疲勞,開心,憤怒),在每個狀态的内部隻需要關心自己的小狀态的跳轉就可以了。這樣就大大的降低了狀态機的複雜度,

另外,如果覺得兩層的狀态機還是狀态太多的話,可以定義更多的狀态層次以降低跳轉連結數。

(摘自此文章)

FSM(狀态機)、HFSM(分層狀态機)、BT(行為樹)

Behavir Tree

有空再更新,先看之前的文章:http://www.cnblogs.com/jeason1997/p/4803243.html

行為樹與FSM不同,它是一種“輪詢式機制”,即每次更新都會周遊樹,判定邏輯是否成立,是否該繼續往下執行。

https://www.cnblogs.com/jeason1997/p/5140201.html

FSM

繼續閱讀