内容都来自于此网站,这里只是里面的文章做了一个总结
目录
1.“命令队列”——行为层实现方式
AI中的行为系统就是根据收集到的信息和特定的输入,经过一个决策过程,做出具体的行为,即 “决策”+“行为”。
用一个分层模型来表示可以分成3层:决策层,行为层和动画资源层(左侧三层)。
上图中的右侧画的是使用“命令队列”方式来实现行为层——该实现方式又划分为三层为“行为命令”,“行为机”和“行为节点”。
- 行为命令中行为可以是组合形式,组合类型可以是 并行,序列,或者是选择的,针对组合行为是需要单独再定义一个行为命令,比如“边吃饭边喝水”的行为命令。
- 行为机里存放的是行为命令。行为机中会根据行为命令的不同的优先级以及是否重复做相应的一些逻辑处理以后再进入到下一层行为节点。
- 行为节点,即执行单元,使用的是简单的状态机来实现,一个执行单元,可能需要几帧或者几十帧来才能完成,所以需要使用状态机根据当前的状态来执行具体的操作。
2.行为树——决策层实现方式
节点分类
首先介绍一下行为树节点,如下图示分成两大类:
- 控制节点(即非叶子节点,再次细分:选择控制节点,序列控制节点,并行控制节点——如何控制可以看下面的图示,就是按字面意思理解)
- 行为节点(即叶子节点)
行为树节点的特性
不管是行为节点,还是控制节点,都还一些共同的属性:前提,交接,以及运行状态。
控制节点
下图显示不同的控制节点的一些特点以及关于如何控制子节点的选择以及前提的一般设定。
根据通用节点的特性,定义了Evaluate,Update,Transition函数以及虚函数OnEvaluate,OnUpdate,OnTransition函数。——逻辑信息。
每个节点还包括定义一个上下文信息类,定义需要记录的数据。——运行时信息。
控制节点的这三个虚函数都是调用子节点的对应函数。具体怎么选子节点就是不同类型的控制节点自己的逻辑了。这是通用代码逻辑,跟具体游戏无关,属于行为树库的内容,具体实现如下:
行为节点
行为节点基类 也是继承自 行为树节点基类,同样有OnEvaluate OnUpdate OnTransition的实现,不同的是还多了三个虚函数 Enter,Execute,Exit。
具体的游戏行为继承自这个行为节点基类,并实现虚函数。下图的实现是行为节点基类的实现:
行为树的输入和输出以及共享数据
介绍黑板,以及行为树内部的操作
上述中的节点的上下文信息不作为一个成员变量放置在节点类中,而是需要用到的时候动态生成,统一放置到TBTWorkingData类中。存储类型用一个字典存储,key为节点的唯一ID,value即为该节点上下文信息。
外部前提的实现
AI系统的请求层
在决策层和行为层中间抽象出一个请求层,可以用双缓冲的方式实现请求层