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