目前在游戲中主流的AI框架是 Behavior Tree
先上一張網上找到的行為圖
從圖中可以看到一個怪物的行為被拆分成了,很多的節(jié)點奖地,通過節(jié)點組合成樹形結構。
每個葉子節(jié)點是實際正真執(zhí)行的動作或條件判斷赋焕,稱之為Action 或Condition参歹,從根節(jié)點到葉子節(jié)點,中間路徑上的節(jié)點隆判,是組合節(jié)點犬庇。
葉子節(jié)點:會將執(zhí)行結果返回,返回類型有Success侨嘀,Failed械筛,Running,三種狀態(tài)
而組合節(jié)點分類三類:
1飒炎、Sequence :按照序執(zhí)行子節(jié)點埋哟,直到其中一個子節(jié)點返回Failed,就停止執(zhí)行。該節(jié)點的返回值也是Failed赤赊。如果所有子節(jié)點中沒有返回Failed的闯狱,就會全部執(zhí)行完,并返回Success給該父節(jié)點抛计。該節(jié)點哄孤,也會返回Success給自己的父親節(jié)點。
2吹截、Selector:按序執(zhí)行子節(jié)點瘦陈,直到遇到子節(jié)點,返回Success波俄,才停止執(zhí)行后續(xù)的子節(jié)點晨逝。并返回Success給自己父節(jié)點,如果所有子節(jié)點都返回Failed懦铺,那當前節(jié)點也返回Failed給自己的父節(jié)點捉貌。
以上這兩類組合節(jié)點會通常會比較常用,節(jié)點的訪問順序冬念,是深度優(yōu)先趁窃,當遇到符合對一個的條件時,才會終止遍歷急前。
另外還有基于這兩類的變種醒陆,比如隨機Sequence,就是不按照順序執(zhí)行子節(jié)點裆针,隨機挑選统求。
3、Paraller:并行執(zhí)行据块,會有一個主節(jié)點码邻,根據主節(jié)點范圍Runniing狀態(tài)的情況,其他節(jié)點將會按序執(zhí)行另假,并將結果返回 running結果像屋,否者就直接返回主節(jié)點的執(zhí)行結果Success or Failed
返回的結果:具體策略
1. Parallel Selector Node: 一False 則返回False,全True才返回True
2. Parallel Sequence Node: 一True則返回True边篮,全False才返回False
3. Parallel Hybird Node:指定數量的Child Node 返回True或False后才決定結果己莺。
整體架構就是將不同的Action或Condition各種組合佃蚜,拼裝成一顆樹毕谴,并通過對應的訪問策略來訪問每個分支贞奋,并執(zhí)行葉節(jié)點睹耐。
在gthub上有一個比較容易理解寫C#版本,主要是應用于Unity3d的行為樹開源框架
https://github.com/f15gdsy/BT-Framework-2 比較容易理解太援,可以直接導入unity3d工程使用掌桩。
有unity3d上還有一些其他的插件可以使用沮明,比如Behavior Design,Node Canvas 還有騰訊開源的behaviac誊册;
可以找到適合自己項目的框架就足矣领突。
要使用這種架構設計的AI框架,絕大部分的工作量案怯,還是集中中Action 和 Condition的具體實現上君旦,工作量會比較大,另外就是對于Action 元行為的設計嘲碱,需要做到足夠的抽象金砍,而且Action的行為一定要 低耦合、高內聚麦锯。只有這樣才能可能有比較高的復用性恕稠。
一般游戲中的主要Action和Conditon抽象行為
- 元action行為動作
- 行走
- 跑步
- 待機
- idle 狀態(tài)
- 沖刺
- CastSkill --》需要參數,skillId
- 順序
- 隨機
- 概率分布
- 搜敵--》仇恨最高
- 走路+射擊(并行操作)
- 動畫播放
- 條件判斷
- 根據血量的判斷條件
- 根據距離的判斷條件
- 根據時間的判斷條件