游戏设计模式 之 AI_行为树

引擎:CocoCreator2.1.0
语言:TypeScript
Git仓库地址:https://github.com/superXfx/GameDesignPatterns.git
定义——
行为被定义为层次化的目标的集合,其表现为树形结构。
智能体首先选择高级抽象目标,然后递归分解成一个可以遵照执行的原子目标的集合。
以此实现原子目标,最终实现高级抽象目标。
类图——

行为树图——

类图看起来比较复杂~,哈哈,其实不难,记住几个关键单就行。
1、树形结构,使用“组件模式”实现。
从“行为树图”中可以看出,复合目标和子目标组成了一个树形结构。
think每次根据权重(由数值策划提供公式)选择一个“分支”,一次执行完整个分支下的所有叶节点,即可完成策略——实际项目中会有很多层,这里简化一下。
2、通过权重选择策略,每个策略都对应一个继承自Goal_Evaluator的类,对应其返回权重的以及设置目标的逻辑。
下面来看看具体实现
简单讲,需要做的事情有3个
1、编写战略目标

重写Enter()函数,负责插入子目标
2、编写子目标
Goal_CheckTriggerState

Goal_FindEmptySlot

Goal_PutTrigger


以上就是策略与子目标的实现,主要工作就是在Enter(),与Process(dt)中,在恰当的时机返回目标状态即可。
3、(用树形结构,即组合模式)组织起来




如图,Goal_Think类通过每个策略的Goal_Evaluator类计算权重,然后addSubgoal,策略在Enter()中也addSubgoal。
这样便组成了一个树形结构,然后通过Process(dt)驱动行为树运行。
扩展:
配置化——我的思路是策划在json表中配置 战略目标以及其对应的子目表“树”。