目录
3、概率选择执行器 Probability Selector
2、嵌套状态机 Sub FSM(官方文档叫Nested FSM)
鉴于官方文档不说人话
按照自己的理解将官方文档进行了翻译,可能会有误。
如果有两个图标,左边为新版图标,右边为官方文档演示的图标
叶节点 Leafs
叶节点不会有子节点,它位于分支的末端,进行具体的操作。
1、行为 Action
- 执行对应的行为
- 返回结果主要为:成功、失败、运行中、
- (以及就绪、错误等比较不需要的)
- 如果处于返回结果为运行中,那么父节点下一次执行时,会跳过其他节点,从这个节点开始继续执行
2、判断 Condition
- 判断条件是否符合
- 返回相应结果
控制组件 Composites
Composites 与多个子节点一起工作,并根据复合功能以某种顺序执行它们。
1、顺序执行器 Sequencer
- 运行逻辑
- 按顺序执行所有子分支,子分支全成功时返回“成功”
- 出现第一个失败时,结束执行,返回“失败”
- 运行中时返回“运行中”
- 使用细节
- 当子节点处于运行中时会标记当前运行中的子节点,每帧进入Sequencer时,都会从标记的子节点开始运行(如果没有标记则从头开始)
- 参数说明
- 随机顺序执行器 Random Sequencer
- 在执行子分支之前进行随机排序
- 动态检测 Dynamic
- 每帧进入都从头开始运行所有的子节点。当子节点返回Running或者Failure时,重置该分支
- 即使开启Dynamic,如果Action没有重置也不会重新执行
- 随机顺序执行器 Random Sequencer
2、选择执行器 Selector
- 运行逻辑
- 顺序执行,当子节点全失败时返回“失败”,
- 出现第一个成功时,结束执行,返回“成功”
- 运行中时返回“运行中”
- 使用细节
- 当子节点处于运行中会标记当前运行中的子节点,每帧进入Selector时,都会从标记的子节点开始运行(如果没有标记则从头开始)
- 参数说明
- 随机选择执行器 Random Sequencer
- 在执行子分支之前进行随机排序
- 动态检测 Dynamic
- 每帧进入都从头开始运行所有的子节点。当子节点返回Running或者Failure时,重置该分支
- 即使开启Dynamic,如果Action没有重置也不会重新执行
- 随机选择执行器 Random Sequencer
3、概率选择执行器 Probability Selector
- 概率版选择执行器
- 运行逻辑
- 选择执行器的根据子节点的概率,随机选择其一进行执行。
- 失败则抛弃这个子节点,再随机选择一次,直到成功或者全部失败,再返回结果。
- 运行中时返回“运行中”
- 参数说明
- 直接失败几率 Failure Chance
- 直接失败指该子节点在失败一次后将直接结束本分支并返回失败。
- 注意: 概率值可以从黑板变量动态地改变概率。
- 直接失败几率 Failure Chance
4、权重选择执行器 Priority Selector
- 权重版选择执行器
- 执行前按设定的权重进行排序,按权重从高到低依次执行所有子节点
- 使用细节
- 优先级可直接调整或者从黑板动态获取
- 参数说明
- DESIRE0~N:指定子节点名~对应权重值
- Add Consideration:添加一个权重因子
- 可从黑板变量动态读取,并且能加入线性关系提供变化
5、平行执行器 Parallel
- 同时执行所有子分支。提供以下策略改变逻辑
- 运行逻辑
- First Failure
- 第一个“失败”出现时,结束平行执行器的所有子分支,并返回“失败”
- First Success
- 第一个“成功”出现时,结束平行执行器的所有子分支,并返回“成功”
- First Success Or Failure
- 第一个“成功”或“失败”出现时,结束平行执行器的所有子分支,并返回对应结果
- First Failure
- 参数说明
- 动态检测
6、轮流选择器 Flip Selector
- 类似于选择执行器,但是一旦子节点返回 Success,它就会移动到末尾(右)
- 因此,上一个执行失败的子节点通常在最前面,最近执行成功的子节点往往在最后面
7、完整执行器 Step Sequencer
- 类似于顺序执行器
- 运行逻辑
- 按一定步骤进行顺序执行。与顺序执行器不同的是,每执行一个子分支,都会返回一次结果。
- 在没有外部改变的情况下,会完整的执行完所有子分支。
8、 二元选择器 Binary Selector
- 二元条件版选择执行器
- 运行逻辑
- 根据参数值(Enum 或 Integer 值)执行对应参数下的子节点
- 读到“成功”执行左节点,读到“失败”执行右节点
- 根据参数值(Enum 或 Integer 值)执行对应参数下的子节点
- 参数说明
- 动态检测Dynamic
- 每次都会重新检查ConditionTask,并立即根据返回结果重新选择执行的子节点,如果当前执行的子节点与上一次执行的子节点不一致则会重置上一次执行的子节点
- 如果没有开启Dynamic,条件执行的ConditionTask通常只会检查一次,直到被重置或者本轮AI结束
- 动态检测Dynamic
9、 条件选择器 Switch
-
条件版选择执行器
- 运行逻辑
-
条件执行根据当前的枚举或者索引值执行相对应的子节点。
-
如果正在执行其它的子节点会立即打断它。
-
-
- 参数说明
- 动态参数 Dynamic
- 每次都会重新读取intCase的参数值,并重新选择行的子节点,如果与上一次执行的子节点不同则会重置上一次执行的子节点
- Selection Mode - 选择的模式
- Index Based:基于数值索引
- Enum Based:基于枚举索引
- Int Case:当前索引数值
- Out Of Range Mode - 取值超出范围处理方式
- Return Failure:返回错误
- Loop Index:当前数值取余作为结果的索引
- 动态参数 Dynamic
装饰器 Decorators
装饰器有且只有一个子节点。他们通常为子节点提供额外的功能,过滤它或以某种方式修改它。
1、中断器 Interrupt
-
Condition Task条件成立时,中断子节点
- 中断器会获取Condition Task的返回状态
- 如果Condition Task的条件成立时,会打断正在运行的子节点并且自身返回失败。
- 否则,Interrupt会一直返回子节点的状态
- 当条件为真或是变为真时,子节点会中断运行并返回“失败”
- 否则中断器返回子节点执行完的内容
- 如果Condition Task的条件成立时,会打断正在运行的子节点并且自身返回失败。
- 重置条件
- 每次执行检查条件是否满足,条件不满足继续执行子节点,否则重置子节点并返回Failure
2、条件器 Conditional
-
Condition Task条件成立时,运行子节点
-
如果Condition Task条件成立则Conditional会返回子节点的状态。
-
否则如果条件不成立并且子节点不处于运行中时Conditional将会返回失败。
-
换句话说,即使条件仅成立一帧时间,子节点也会被完整执行
-
- 参数说明
- 动态检测 Dynamic
- ConditionTask返回失败时会重置子节点
- 动态检测 Dynamic
3、返回值修改器 Invert
- 对子节点的返回结果进行修改
- 简单的应用例子就是对子节点的返回值进行取反
4、循环器 Repeat
- 循环器会重复X次子节点,直到次数用尽,或达到指定条件
- 次数可以设置无限循环
- 成功:如果是“Repeat Times”,则当子节点在其最后一次重复时返回成功。如果是“Repeat Until”,则当子节点返回成功且所需状态为成功时。
- 失败:如果是“Repeat Times”,则当子节点在最后一次重复时返回失败。如果是“Repeat Until”,则当子节点返回失败且所需状态为失败时。
- 运行:只要它在重复。
- 使用细节
- 注意!此节点需要多帧执行
- Repeat的循环次数会在节点重置的时候刷新
- 重置操作
- 每次执行除了子节点处于Running都会重置子节点
- 参数说明
- Repeater Mode 循环模式
-
Repeat Times,循环执行指定次数后结束,并返回子节点的返回状态
- Repeat Until,循环执行直到子节点返回对应的状态后结束,并返回子节点的返回状态
- Repeat Forever,无限循环执行子节点,并一直返回运行状态
-
- Repeater Mode 循环模式
5、筛选器 Filter
- 筛选器会对子节点进行固定次数或者间隔固定时间的执行
- 类似于冷却,也可以用来限制行为的执行时间(子节点为多帧行为)
- 成功:当访问子节点并返回成功时
- 失败:当访问子节点并返回失败时,或 取消勾选 “Inactive when limited”且不允许访问子节点时
- 运行:当访问子节点并返回运行时
- 重置条件
-
Filter的计数次数只有重启AI时重置
-
注意,作为子树中的组件使用时,由于子树每次执行完都会重启,所以子树的计数次数会被重置
-
-
- 使用细节
- Filter间隔时间功能会在第一次冷却前执行一次
-
可以从 Blackboard 中设置次数和冷却时间值,以使该节点更具动态性。
6、迭代器(列表版的循环直到) Iterate
- 迭代器将迭代黑板中的指定列表,将迭代的元素放到黑板上,并根据名称执行子节点
- 成功:当列表遍历完成后返回成功时,或者如果设置了“First Success”,在第一个次执行返回成功时
- 失败:当列表遍历完成后返回失败时,或者如果设置了“First Failure”,在第一个次执行返回成功时
-
运行:还处于遍历中
- 使用细节
- 可以设定在此迭代器“First Success”或是“First Failure”时,中止迭代
- 没有设置终止条件,或终止条件不被满足时,将返回最后一次的结果
- 如果不重置迭代器,迭代器将保留当前位置,下一次开始迭代时从当前位置的下一个开始(当前位置在末尾时,相当于重置)
- 此修饰器为单帧执行
- 重置操作
- 每次执行都会循环迭代整个目标列表,迭代过程中会一直重置子节点直到迭代终止
- 参数说明
- Target List:传入的列表Variable
- Current Element:当前遍历的列表中的元素
- Current Index:当前遍历的索引位置
- Max Iteration:遍历最大次数,如果为-1的话遍历整个列表
- Termination Condition:终止条件
- Reset Index:如果开启了,那么迭代器将在重置时将当前遍历的索引重置为零,否则索引将保持不变,除非它是列表的最后一个索引。 可以把它想成“for each”。
7、超时 Timeout
- 子节点执行超过指定秒数时,结束执行并返回“失败”
- 否则一直返回节点的返回值
- 重置条件
- 超时后重置子节点
8、等待至 Wait Until
-
Wait Until会一直返回运行状态,直到条件为True时开始执行子节点并返回子节点返回值,并且直到子节点返回成功或者失败时才结束。
- 成功:子节点返回成功
- 失败:子节点返回失败
- 运行:子节点返回运行或条件为False时
- 使用细节
- 条件只会在子节点没有运行的时候检查
- 一旦子节点开始运行后,哪怕条件变为假也不会中止
9、忽略返回值 Optional
- Optional会忽略子节点的成功或者失败返回值,一律返回选配状态(Optional,通常父节点会忽略这个返回值)
- 无视返回结果这个作用近似于“禁用子节点”,区别是使用这个修饰器的子节点可以被执行
10、异步守护节点 Guard
-
如果具有相同标记(Token)的另一个Guard已经在守护(运行)该标记,则保护自身子节点不运行。Guard对于同一个对象下的所有行为树有效。
- 当处于保护中,可以通过参数设置修饰节点返回值为失败或者运行
- 成功:子节点返回成功
- 失败:子节点返回失败或处于保护中并且设置了返回值为失败
- 运行:子节点处于运行时或处于保护中并且设置了返回值为运行
- 参数说明
- If Guarded: 处于保护中返回值是什么
- Return Failure:返回失败
- Wait Until Released:返回运行
- If Guarded: 处于保护中返回值是什么
- 使用细节
- 此装饰器需要规定一个标签
- 警卫的作用是全局性的。在被挂在同一个代理人下的所有行为树中,警卫会跨行为树生效。
11、覆盖代理人 Override Agent
- 为子节点设置另一个代理人(Agent),子节点的内容将转由新代理人进行执行。
- 还可以用此装饰器来恢复到原始代理人(应该使用嵌套这个装饰器来实现)
- 代理人可以在黑板中动态获取
次级行为 Sub-Behaviours
子行为是对其他整体图的引用,通常是行为树,用于组织和行为模块化。
类似于bolt里的超级sub
1、嵌套行为树 SubTree
- 分配一整个行为树,以后行为树做成完整功能模块后将非常有用
- 将会返回子行为树里返回的所有内容。
- 此行为树里的黑板内容可以在子行为树中进行运用。
2、嵌套状态机 Sub FSM(官方文档叫Nested FSM)
- 分配一整个状态机
- 可以规定“成功”或“失败”状态,指定后,当子状态机进入规定的状态时,返回相应结果,并停止FSM
- 如果没有规定状态,会在结束时返回“成功”
- 此行为树里的黑板内容可以在子状态机中进行运用。