行为树是用于好多游戏里常用的AI技巧。光晕2 是第一个主流的使用行为树的游戏,在发行之后他们做了详细的说明使得行为树更加的流行。行为树是一个结合了好多不同AI技术的技术:分成状态机、时间表、计划和执行动作。相对于他们主要的优点是可以在一个试图编辑器里很简单的理解和创建。
【图一】
最简单级别的行为树是集合好多的任务。有四种不同类型的任务:action, conditional, composite, and decorator(动作,条件,复合,修饰)。Action任务可能是最易于理解的在游戏中通过一些方法改变状态。Conditional任务用于在游戏中测试一些性质(不知道咋翻译比较接地气)。例如在一个行为树上有两个Conditional任务和两个Action任务。首先检查在视野范围内是否有敌人然后检查子弹是否足够(这是两个Conditional任务的功能)。如果这两个Conditional任务都返回true然后执行后边的两个Action任务。一个用于射击一个用于表现射击的动作。子树结构才是展现行为树的强大之处。你可以把两个Action任务放在同一个子节点下,当其中一个Conditional任务返回fail的时候就执行另外的action任务让角色从敌人旁边跑掉。不同的子树结构能组合出更高级的AI。
Composite任务是控制一系列子任务的父任务。通过上面的例子我们知道Parallel任务和Sequence任务都属于Composite。一个Sequence任务运行每个任务一次直到所有任务都运行了。它将会首先运行一个Conditional任务来检查敌人是否在视野范围。当敌人在视野范围它会运行下一个Conditional任务来检查武器里是否有足够的子弹,如果有的话将会执行Parallel任务来射击和演示动画。Sequence任务同一时间只执行一个子任务,Parallel任务则同时执行所有的子任务。
最后一个类型的任务就是Decorator任务。Decorator任务是只有一个子任务的父任务。它的功能就是通过一些途径来修改子任务的行为。虽然在上边的例子里我们没有用到它,但是在想忽然中断任务流程的情况下你会用到它的(被称作中断任务)。举个例子,当一个委托人在执行一个收集材料的任务。当敌人靠近时它必须要一个中断收集材料的任务。例如,当一个Decorator任务作用在它的子任务要来回执行x次的时候,或者是在这个Decorator任务在返回success之前让子任务一直执行。
有一个重要的议题就是行为树的状态。你可能会有一个在一帧内没法完结的任务。就像大多数动画不可能在一帧里完成开始到结束。进一步说,Condational任务需要一种方式去告诉他们的父任务是否返回的是成功以便来决定是否让继续运行子任务。这些问题都可以用任务的状态来解决。在行为树里一个任务有running, success, failure三种状态。
在第一个例子里射击动作任务就是在播放射击动画的时候有个Running状态。另一个判断敌人是否在视野中的任务则将会在一帧之内返回success或者failure。
BehaviorDesigner带来这这些新概念,它们被封装在类似unity的MonoBehavior的API的API接口中。BehaviorDesigner在标准安装包内有许多复合和修饰类。Action 和 conditional任务因为牵扯到很多游戏细节所以并没有包含在内但是有一些简单的例子。可以根据不同类型的任务创建新的任务,或者可以通过PlayMaker或UScript来创建。随后会有一些视频教程会让学习变得更加简单。