事件处理执行行为树的过程中,当状态、条件发生变化或发生事件(Event)时如何响应或打断当前的执行是个重要的问题。 目前behaviac组件支持三种方式来处理状态变化或事件发生:并行节点、选择监测节点、事件附件等。简而言之,并行和选择监测节点的工作方式是采用“轮询”的方式,每次执行时需要重新评估所有子节点,而不是像其他节点会保留上一次正在执行的子节点以便在下一次执行时继续执行。事件附件是在游戏逻辑发出事件时,才按需得到响应。 1 并行节点依靠并行(Parallel)节点处理事件,需要把事件用条件的形式表达并且需要监控该条件,当该条件不满足的时候就退出。这种方式在概念上不太清晰,使用起来也比较繁琐。 图1 并行节点 2 选择监测节点选择监测(SelectorMonitor)和监测分支(WithPrecondition)节点作为对传统行为树的扩展,可以很自然的处理事件和状态的改变。选择监测和监测分支节点只能配对使用,即选择监测只能添加监测分支作为它的子节点,监测分支也只能作为选择监测的子节点被添加。
图2 选择监测节点 3 事件附件事件(Event)作为一种附件,是behaviac组件的一大特色。事件主要用于在游戏逻辑发出事件时,得到响应后打断当前正在执行的行为树,并切换到所设置的另一个行为树。 用一个具体例子来说明事件的原理和用法:
图3.1 为Agent类创建一个任务
图3.2 为行为树指定任务
图3.3 为行为树添加事件
这样,在执行行为树event_ut_1时,如果接收到事件“event_test_int_bool”,那么行为树中的事件附件将得到响应和处理,行为树的执行就会从当前的event_ut_1跳转到event_subtree_2。 调用FireEvent的时候,只有处于running状态的节点才响应事件。这样子是是为了事件的灵活性的考虑。如果不需要依赖节点是否处于running状态,只是需要响应事件,可以把事件配置在根节点上。 另外需要补充说明的是,行为树event_subtree_2带有任务节点,我们也可以直接将该行为树拖拽到行为树event_ut_1中,如图3.5所示。 图3.5 任务直接作为子树 这样在行为树event_ut_1中,选中引用节点event_test_int_bool后,就可以直接配置该子树执行时所需的参数(这里是val_int和val_bool),如图3.6所示。 行为树的任务及其参数可以类比编程语言中的函数及其参数,因此event_test_int_bool这个“函数”有两个“形式参数”val_int和val_bool,而图3.6中所选择的5和true值就是event_test_int_bool函数执行时所用到的“实际参数”。 图3.6 为子树设置任务参数 只有根节点是Task的子树才能被拖拽到另一个符合要求的树上生成事件。 |
|