行為樹(Behaviour Tree):概念垦搬,AI
--掌握行為樹的方法
- 起源呼寸,為了解決什么問題
- 發(fā)展歷史,解決了什么問題猴贰,怎樣解決的
- 概念对雪,抽象出了哪些東西
- 應(yīng)用,需要給行為樹的需求分類米绕,掌握不同類型的需要最適合的行為樹實(shí)現(xiàn)
- 通用的行為樹工具瑟捣,能力范圍,擴(kuò)展方式
- 特定游戲類型的行為樹工具栅干,能力范圍迈套,擴(kuò)展方式
- 實(shí)現(xiàn),各類行為樹的實(shí)現(xiàn)方式
1.通用的代碼組織方式碱鳞,代碼能力范圍
2.特定游戲類型的代碼組織方式桑李,代碼能力范圍
--認(rèn)識行為樹
升級版的fsm
更靈活,可配置性更強(qiáng),可以讓game designer方便的參與邏輯編寫
--實(shí)現(xiàn)方案
數(shù)據(jù)結(jié)構(gòu)中的行為樹
--概念收集和解讀贵白,這些概念主要來自于"ai分享站"率拒,感謝作者無私分享
- 決策(Decision)
- 根據(jù)輸入選擇行為
- 行為(Behavior)
- 具體輸出,改變程序狀態(tài)禁荒,具體來說俏橘,操作多媒體,視覺特效圈浇,和其它模塊交互
- 邏輯動(dòng)作(Logical Action)寥掐,行為池(Behavior Pool)
- 一系列的行為
- 單一行為(Simple Behavior)
- 復(fù)合行為(Composite Behavior)
- 序列(Sequenece):一個(gè)個(gè)行為接著做
- 并行(Parallel):兩個(gè)或多個(gè)行為同時(shí)進(jìn)行
- 選擇(Selector):從候選行為中選擇一個(gè)執(zhí)行,包括腳本選擇磷蜀,和隨機(jī)選擇
- 控制節(jié)點(diǎn)(Control Node)
- 同決策
- 行為節(jié)點(diǎn)(Ternimal Node)
- 同行為
- AI中的共享數(shù)據(jù)召耘,如blackboard
- 共享數(shù)據(jù)方便
- 共享數(shù)據(jù)不容易維護(hù)
- 因?yàn)槎嗳藚f(xié)作,變量可能重復(fù)褐隆,導(dǎo)致混亂
- 訪問匿名污它,無法方便的找到依賴
- 使用共享數(shù)據(jù)需要制定使用規(guī)范
- AI中的LOD
- 不需要決策的停止
- 不需要頻繁決策的,降低決策頻率
- 注:lod: level of detail縮寫庶弃,在渲染優(yōu)化中衫贬,如果一個(gè)物體距離攝像機(jī)越近,那么就讓它顯示的細(xì)節(jié)越多歇攻,否則細(xì)節(jié)越少固惯。從而減少渲染的量,提升性能缴守。
- AI中的雙緩沖
- 當(dāng)事件發(fā)生葬毫,決策層進(jìn)行處理,這個(gè)處理過程可以跑在別的線程
- 處理完的結(jié)果做完行為層的輸入
- AI中的Lazy
- 當(dāng)邊界條件頻繁變換時(shí)屡穗,ai快速響應(yīng)變換贴捡,像一個(gè)傻瓜,lazy讓ai淡定許多村砂,不那么傻了
- 方法
- 定時(shí)器烂斋,ai收到world信息后過一段時(shí)間再處理
- 漸變閾值,world在某個(gè)邊界變化的時(shí)候础废,讓一個(gè)值不斷收縮汛骂,如果邊界又變化了,從新收縮色迂,直到不再變化香缺,收縮到一個(gè)值后,ai就會進(jìn)行決策和行動(dòng)
- AI調(diào)試
- 時(shí)機(jī):調(diào)整ai行為歇僧,解決ai bug
- 盡量使用:腳本图张,參數(shù)配置
- 編輯器锋拖,解決編譯緩慢問題,分離邏輯祸轮,運(yùn)行時(shí)調(diào)整
- 觀察器兽埃,運(yùn)行時(shí)查看參數(shù)
- 遠(yuǎn)程命令,發(fā)送一段指令給引擎适袜,使其執(zhí)行相應(yīng)的函數(shù)
- 回放柄错,為了復(fù)現(xiàn)ai的問題,依賴引擎苦酱,需要制定良好的ai架構(gòu)
- 游戲世界環(huán)境售貌,決策層執(zhí)行指令序列(用于分析行為)
- AI勢力圖
- 一般是一個(gè)二維數(shù)組
- 存放地圖上某個(gè)格子的權(quán)值
- 可以過去或者不可以過去的程度
- 動(dòng)態(tài)地圖尋路算法會用到
- 勢力圖動(dòng)態(tài)更新
- 可以用在A*算法求路徑上
- 行為節(jié)點(diǎn)的狀態(tài),processing, successed, failed
- BT的執(zhí)行流程
- 從根節(jié)點(diǎn)出發(fā)疫萤,尋找一個(gè)可執(zhí)行節(jié)點(diǎn)颂跨,從那個(gè)節(jié)點(diǎn)開始執(zhí)行
- 選擇節(jié)點(diǎn)
- 優(yōu)先級型,從左往右逐個(gè)測試扯饶,執(zhí)行條件逐漸放寬
- 非優(yōu)先級型恒削,每次從上一個(gè)執(zhí)行的節(jié)點(diǎn)開始測試準(zhǔn)入條件,用互斥避免節(jié)點(diǎn)被屏蔽
- 權(quán)重型尾序,根據(jù)權(quán)重做概率選擇
- 并行節(jié)點(diǎn)
- 需要解決該父節(jié)點(diǎn)的狀態(tài)是怎么由并行的子節(jié)點(diǎn)狀態(tài)確定的
- Blackboard
- 封裝行為樹的輸入
- 行為樹間共享數(shù)據(jù)
- 節(jié)點(diǎn)間共享數(shù)據(jù)
- 根據(jù)上述的使用情景钓丰,一般有多個(gè)黑板
- 層次狀態(tài)機(jī) hfsm
- 解決負(fù)責(zé)狀態(tài)機(jī)跳轉(zhuǎn)關(guān)系混亂問題
- 把跳轉(zhuǎn)分組,每組間相互跳轉(zhuǎn)每币,組內(nèi)狀態(tài)相互跳轉(zhuǎn)携丁,如果組內(nèi)還是負(fù)責(zé),繼續(xù)在組內(nèi)分組
- 調(diào)控AI的難度
- 調(diào)整ai的感知能力
- 調(diào)整ai的決策能力
- 減少對特殊情況的處理
- 放寬條件脯爪,收窄條件则北,減少對玩家不利的行動(dòng)
- 調(diào)整ai的行動(dòng)能力
- 武器,速度痕慢,傷害,基本種類和程度的變換
- goai涌矢,目標(biāo)導(dǎo)向的ai
- 適用于持續(xù)型的ai掖举,不需要頻繁決策
- 需要plan模塊,分析實(shí)現(xiàn)目標(biāo)需要做什么娜庇,檢查是否做完塔次,標(biāo)記進(jìn)度
- 游戲世界信息的收集和組織
- 信息圖,游戲ai決策用到的世界信息圖表名秀,一般是二維數(shù)組
- 危險(xiǎn)程度
- 優(yōu)先程度
- lazy collect励负,不是每次世界更新都要更新信息圖,ai用到的時(shí)候再去收集
- 分塊匕得,大的信息圖進(jìn)行分塊继榆,每次先選定要那一塊的信息巾表,然后讓那一塊的感知器進(jìn)行收集
- 信息圖共享,不同ai共享信息圖
- 狀態(tài)機(jī)轉(zhuǎn)行為樹的范式
- 模式1:當(dāng)處在任何狀態(tài)中略吨,一旦某條件滿足集币,即跳轉(zhuǎn)到某個(gè)特定的狀態(tài):selector
- 模式2:對于同一個(gè)跳轉(zhuǎn)條件,處在不同的狀態(tài)會有不同的跳轉(zhuǎn):selector翠忠,sequence
- 模式3:根據(jù)條件跳轉(zhuǎn)到多個(gè)狀態(tài)鞠苟,包括自跳轉(zhuǎn)
- sequence selector
- selector
- 模式4:循環(huán)跳轉(zhuǎn):交替權(quán)重的selector
- 可預(yù)測的行為系統(tǒng)
- 某些情況下,決策層需要知道如果選擇了某個(gè)行為未來某個(gè)時(shí)間的世界信息秽之,此時(shí)需要行為層提供預(yù)測能力
- 基于預(yù)先設(shè)置的公式的預(yù)測
- 基于動(dòng)畫系統(tǒng)的預(yù)測当娱,如果是動(dòng)畫系統(tǒng)會改變world信息,這個(gè)就需要做更多工作導(dǎo)出會造成的影響
- 被動(dòng)式請求:不是玩家主動(dòng)觸發(fā)的行為考榨,如:跑跨细,跳,技能 是主動(dòng)請求董虱, 絆倒扼鞋,掉血,死亡愤诱,裝彈藥
處理方式- 被動(dòng)請求(如果有)云头,主動(dòng)請求(如果有)同時(shí)傳遞給選擇模塊,此處淫半,選擇模塊在決策模塊之后運(yùn)行溃槐,被動(dòng)請求由游戲世界直接產(chǎn)生
- 主動(dòng)請求是決策的輸出
- 在行為樹的決策層中加入selector,world導(dǎo)致的改變不直接產(chǎn)生請求科吭,而是改變決策層的狀態(tài)昏滴,每次決策時(shí)決策層輸出請求給行為層
- 設(shè)計(jì)ai中的參數(shù)系統(tǒng)
- 方便設(shè)計(jì)人員工作,減小不同工種粘合度
- 參數(shù)數(shù)據(jù)和文件可以互轉(zhuǎn)
- 關(guān)聯(lián)變換对人,靜態(tài)的數(shù)據(jù)關(guān)聯(lián)改變谣殊,不用計(jì)算公式運(yùn)行時(shí)計(jì)算
- 注:這樣數(shù)據(jù)的觀測性好,但是不如直接提供一個(gè)查看器牺弄,我支持簡單數(shù)據(jù)運(yùn)行時(shí)計(jì)算的做法
- 共享節(jié)點(diǎn)型行為樹
- 為了節(jié)約內(nèi)存姻几,行為樹的邏輯結(jié)構(gòu)部分抽離出來做為共享對象使用
- 定義一下這個(gè)共享的部分
- 表示行為樹的結(jié)構(gòu)信息,如sequence, selector, parallel的組織方式势告,表達(dá)了處理的流程