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