1 了解行为树
首先制作AI有很多种决策方式,比如 有限状态机(Finite-State Machines),分层状态机(Hierarchical Finite-State Machines),行为树(Behavior Trees),效用系统(Utility Systems),目标导向型行动计划(Goal-Oriented Action Planners),分层任务网络(Hierarchical Task Networks) ,不同的决策方式针对不同的游戏行为,各有优缺点,可以择优选择,我们为什么要选择行为树呢?行为树中的可扩展性是最优的,且灵活性可以适应任何不同的AI情况,其随机性非常可视化判断与调试,但是行为树显而易见也有部分缺点,比如大量判断耗时,且不一定是最优决策选择。
2 走进行为树
行为树的每一个叶子 我们都称为节点,通过一个个节点来搭建一个树结构,即数据结构的树结构。通过树结构的中序遍历来将所有节点串联在一起。其中没有下一个节点的称为 子节点,有下一个节点的 称为父节点。
子节点 又分为 行为节点、条件节点。 父节点 分为 装饰节点、组合节点。其中在Unreal Engine中 条件节点被结合在 装饰节点中。
通过这四种节点的不同排列组合 构建成了一颗行为树。
3 搭建行为树(基于unity的Behavior Designer行为树插件)
每一颗行为树都是从根节点开始
接下来要新建一个父节点,我们一般新建一个组合结点中的顺序节点,要行为树从子节点按从左到右执行。比如:
接下来只要搭配子节点就完成了 一个简单的行为树
这里有一个父顺序节点,一个条件节点一个动作节点 共同构成一个子节点。这里表示满足条件节点的条件就执行该动作节点的动作。
4 编写节点
4.1 编写父节点
编写装饰节点 需要继承Decorator 重写CanExecute 来判断子节点是否成功与失败 重写Decorate来判断自己是否返回成功与失败 例如:
编写组合节点 需要继承Composite 组合节点比较复杂,大体需要控制所有子节点的返回来确定自己的成功失败返回值,通过重写OnChildStarted(int childIndex) 来返回子节点编号,
重写CanExecute()来判断子节点是否成功与失败来继续执行下一个节点,重写OverrideStatus来判断自己是否返回成功与失败 例如:
编写子节点
编写条件节点 需要继承Conditional 只要重写OnUpdate 来判断条件,选择返回值即可 比如:
编写行为节点 需要继承Action 只要重写OnUpdate 来执行行为,选择返回值即可 比如:
后续继续学习就看下章