Cocos creator主程入門教程——有限狀態(tài)機(jī)和行為樹
本篇介紹有限狀態(tài)機(jī)和行為樹。有限狀態(tài)機(jī)用于有限的狀態(tài)下的AI,由于同時(shí)只能處于一個(gè)狀態(tài),多個(gè)狀態(tài)需要多個(gè)有限狀態(tài)機(jī),一般用于簡單的AI行為。行為樹是基于固定行為,通過遍歷樹來決定采用哪種行為。行為的設(shè)計(jì)和執(zhí)行采用解釋器模式,由策劃設(shè)計(jì)數(shù)據(jù),程序解析執(zhí)行,行為組合的靈活性高,比較適合劇情NPC。但當(dāng)樹比較深、分支比較多時(shí),遍歷的效率就需要考慮優(yōu)化。一般我們認(rèn)為有限狀態(tài)機(jī)執(zhí)行的性能優(yōu)于行為樹,但不能勝任復(fù)雜、靈活的AI設(shè)計(jì)。而行為樹則比較適合復(fù)雜、靈活的AI設(shè)計(jì)。
先介紹下有限狀態(tài)機(jī)??紤]在一個(gè)類似《刀塔傳奇》的橫版動(dòng)作卡牌游戲的戰(zhàn)斗里,每個(gè)英雄有出場、站立、走位、受擊、吟唱、施法等狀態(tài)。英雄每時(shí)每刻只能處在這些狀態(tài)中其中一個(gè)狀態(tài),每個(gè)狀態(tài)都有自己的邏輯,狀態(tài)的改變都由事件驅(qū)動(dòng)。像這樣簡單的AI,可以使用有限狀態(tài)機(jī)來實(shí)現(xiàn)。
有限狀態(tài)機(jī)包括幾個(gè)要素:
1.狀態(tài),狀態(tài)機(jī)同時(shí)只能處于一個(gè)狀態(tài),在指定狀態(tài)下有相應(yīng)的邏輯,例如行走狀態(tài),播放行走動(dòng)畫,每幀修改英雄的x、y值
2.事件,事件是狀態(tài)轉(zhuǎn)變的觸發(fā)器,包括內(nèi)部事件和外部事件。例如最近的敵人達(dá)到攻擊距離,觸發(fā)從行走狀態(tài)轉(zhuǎn)變?yōu)檎玖顟B(tài)。CD時(shí)間到達(dá),觸發(fā)從站立狀態(tài)轉(zhuǎn)變?yōu)槭┓顟B(tài)
3.狀態(tài)轉(zhuǎn)變,狀態(tài)間可以相互轉(zhuǎn)變,轉(zhuǎn)變過程有對應(yīng)的邏輯。例如從行走狀態(tài)轉(zhuǎn)變?yōu)檎玖顟B(tài),播放站立動(dòng)作。
現(xiàn)在來介紹下行為樹。在RPG游戲中,地圖上存在一些劇情NPC,不同的劇情下,NPC的行為會不一樣。這些NPC的行為可以通過行為樹進(jìn)行管理。行為樹是在固有行為集下,進(jìn)行行為抉擇的AI算法。行為樹包括數(shù)據(jù)解析、邏輯控制、行為執(zhí)行三部分。
行為樹數(shù)據(jù)由節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)有對應(yīng)的行為類型、參數(shù)、返回值。節(jié)點(diǎn)有一個(gè)子節(jié)點(diǎn)數(shù)組,通過這種方式將節(jié)點(diǎn)組織成樹狀。
export class BehaviorNode {
private type: number = 0;
private params: any = null;
private retVal: any = null;
private subBehaviors: Array<BehaviorNode> = [];
}
邏輯控制節(jié)點(diǎn)都有子節(jié)點(diǎn),邏輯控制指的是跟編程類似的if條件判斷、while循環(huán)、串行執(zhí)行、并行執(zhí)行等。if行為如果返回true,執(zhí)行子節(jié)點(diǎn)行為,子行為結(jié)束則整體行為結(jié)束。while行為如果返回true,執(zhí)行子節(jié)點(diǎn)行為,如果子節(jié)點(diǎn)結(jié)束,重置子節(jié)點(diǎn)重新執(zhí)行。串行行為,子節(jié)點(diǎn)一條一條的依次執(zhí)行,子節(jié)點(diǎn)結(jié)束則整體結(jié)束。并行行為,子節(jié)點(diǎn)同時(shí)執(zhí)行,子節(jié)點(diǎn)結(jié)束則整體結(jié)束。

行為樹的葉節(jié)點(diǎn)是實(shí)際行為執(zhí)行的節(jié)點(diǎn),在開發(fā)一款RPG游戲時(shí),需要根據(jù)劇情需要,提煉出角色的細(xì)粒行為,例如行走、對話、播放表情、切換動(dòng)畫、觸發(fā)戰(zhàn)斗等。一般地,RPG都會開發(fā)一個(gè)對應(yīng)的劇情編輯器,對地圖上的NPC進(jìn)行行為設(shè)定,導(dǎo)出對應(yīng)行為的參數(shù)。游戲加載這些數(shù)據(jù),解析生成行為樹,NPC每幀執(zhí)行行為樹,葉節(jié)點(diǎn)行為有對應(yīng)的執(zhí)行方法,方法的參數(shù)為行為節(jié)點(diǎn)的參數(shù)。
private _parseWalkData(): BehaviorNode {
// TODO 二進(jìn)制數(shù)據(jù)解析為json
}
public execBehavior(b: BehaviorNode): void {
if (!b) {
return;
}
switch(b.type) {
case BehaviorType.WALK:
this.execWalk(b);
break;
}
}
private _execWalk(b: BehaviorNode): void {
let actorId = b.params.id;
let destGridX = b.params.destGridX;
let destGridY = b.params.destGridY;
let actor = map.getActor(actorId);
let curGridX = actor.gridX;
let curGridY = actor.gridY;
let loadGrids = AStar.findLoad(curGridX, curGridY, destGridX, destGridY);
actor.setLoad(loadGrids);
}
一般地,游戲地圖中的物件都可以掛載行為樹,地圖本身、角色、地圖物品等,將一個(gè)劇情的復(fù)雜行為,分拆到每一個(gè)地圖物件上,通過劇情任務(wù)作為條件區(qū)分觸發(fā),簡化行為的組織。程序員只負(fù)責(zé)將策劃的設(shè)定提取出細(xì)粒行為,編寫對應(yīng)的數(shù)據(jù)解析和執(zhí)行方法,由策劃使用編輯器編輯數(shù)據(jù),由數(shù)據(jù)驅(qū)動(dòng)劇情的推進(jìn)。、
更多資源請點(diǎn)擊以下鏈接:
https://bycwedu.vipwan.cn/promotion_channels/630597732