一、打开
二、创建简单的行为树
修改名字
描述
组
三、节点
1.: Composite Node(对多个任务做操作)
与选择器任务类似,当一个子任务返回成功时,优先级选择器任务将返回成功。优先级选择器将询问任务的优先级以确定顺序,而不是在树中从左到右依次运行任务。优先级较高的任务有更高的机会首先运行。
与选择器任务类似,当子任务返回成功时,随机选择器任务将返回成功。不同之处在于random selector类将以随机的顺序运行它的子类。选择器任务是确定性的,因为它将始终从其中运行任务在树的右边。随机选择器任务打乱子任务,然后以随机顺序开始执行。除此之外,随机选择器类与选择器类相同。它将继续运行任务,直到任务成功完成。如果没有孩子任务返回成功,然后返回失败。(随机与)
与序列任务相似,随机序列任务在每个子任务都返回成功时返回成功。区别在于random sequence类将以随机顺序运行它的子类。seguence任务是确定性的,因为它将在树中从左到右运行任务。随机seauence任务打乱子任务,然后开始按随机顺序执行。除此之外,随机序列类与序列类是相同的。当单个任务以失败告终时,它将停止运行任务。在一个任务失败时,它将停止执行所有的子任务并返回ailure。如果没有子元素返回failed,那么它将返回success
(随机或)
选择器求值器是一个选择器任务,它会在每次选择时重新计算它的子对象。它将运行优先级最低的子程序,该子程序将返回正在运行的任务状态。每一次都这样做。如果一个高优先级的子程序正在运行,而一个低优先级的子程序想要运行下一帧,它就会中断高优先级的子程序。当第一个子元素返回成功时,选择器求值器将返回成功,否则它将继续尝试优先级更高的子元素。这个任务模仿了条件中止功能,但子任务不一定非得是条件中止任务。
Composite 节点按照复合性质还可以细分为3种:
Selector Node(或)
只要有一个孩子成功了,我就成功了
当执行本类型Node时,它将从begin到end迭代执行自己的Child Node:
如遇到一个Child Node执行后返回True,那停止迭代,
本Node向自己的Parent Node也返回True;否则所有Child Node都返回False,
那本Node向自己的Parent Node返回False。
Sequence Node(与)
(! 是因为 下面至少有一个任务)
从左到右依次执行,只要有一个孩子返回失败,则都失败,全成功的成功
当执行本类型Node时,它将从begin到end迭代执行自己的Child Node:
如遇到一个Child Node执行后返回False,那停止迭代,
本Node向自己的Parent Node也返回False;否则所有Child Node都返回True,
那本Node向自己的Parent Node返回True。
并发执行它的所有Child Node。
Parallel Node(并行)
平行系列不细说,后续有用会补充的
与序列任务类似,并行任务将运行每个子任务,直到子任务返回失败为止。区别在于并行任务将同时运行它的所有子任务,而不是一次运行每个任务。与sequence类一样,当并行任务的所有子任务都返回success时,它将返回success。如果一个任务返回失败,并行任务将会覆盖所有的子任务并返回失败。
而向Parent Node返回的值和Parallel Node所采取的具体策略相关:
Parallel Selector Node: 一False则返回False,全True才返回True。
Parallel Sequence Node: 一True则返回True,全False才返回False。
Parallel Hybird Node: 指定数量的Child Node返回True或False后才决定结果。
Parallel Node提供了并发,提高性能。
不需要像Selector/Sequence那样预判哪个Child Node应摆前,哪个应摆后,
常见情况是:
(1)用于并行多棵Action子树。
(2)在Parallel Node下挂一棵子树,并挂上多个Condition Node,
以提供实时性和性能。
Parallel Node增加性能和方便性的同时,也增加实现和维护复杂度。
PS:上面的Selector/Sequence准确来说是Liner Selector/Liner Sequence。
AI术语中称为strictly-order:按既定先后顺序迭代。
Selector和Sequence可以进一步提供非线性迭代的加权随机变种。
Weight Random Selector提供每次执行不同的First True Child Node的可能。
Weight Random Sequence则提供每次不同的迭代顺序。
AI术语中称为partial-order,能使AI避免总出现可预期的结果。
2.:Decorator Node(对单个任务做操作)
装饰节点的功能正如它的字面意思:它将它的Child Node(孩子节点)执行后返回的结果值做额外处理(装饰)后,再返回给它的Parent Node(父节点)。很有些AOP的味道。
计算指定的条件任务。如果条件任务返回成功,则运行子任务并返回子状态。如果条件任务没有返回成功,则子任务不会运行,并立即返回失败状态。(底下可设置条件)
中断任务将停止所有子任务的运行,如果它被中断。中断可以由执行中断任务来处理。中断任务将继续运行它的子任务,直到调用这个中断。如果没有中断发生,并且子任务完成了它的执行,中断任务将返回值由子任务分配。
逆变器任务在子任务完成执行后将返回值倒置。如果子节点返回成功,则逆变器任务返回失败。如果子进程返回失败,则逆变器任务返回成功(对子任务取反)
中继器任务将重复它的子任务的执行,直到子任务运行指定的次数。即使子任务返回失败,它也可以选择继续执行子任务。(强制执行指定次数)
除非子任务正在运行,否则返回失败任务将始终返回失败。
返回成功的任务将始终返回成功,除非子任务正在运行
警卫任务类似于多线程编程中的信号量。任务守卫任务是为了确保有限的资源不是过度使用。
例如,您可以将一个警卫放置在一个运行animation的任务之上。在你的行为树的其他地方,你可能也有另一个任务,播放不同的动画,但使用相同的骨骼动画。正因为如此,你不希望动画同时播放两次。放置任务保护可以让您指定同时可以访问特定任务的次数在前面的动画任务示例中,您将指定访问计数为1。通过这种设置,动画任务一次只能由一个任务控制。如果第一个任务正在播放动画,而第二个任务也想控制动画,它将不得不等待或完全跳过该任务。
会始终执行他的子任务直到子任务返回失败
会始终执行他的子任务直到子任务返回成功
比如Decorator Not/Decorator FailUtil/Decorator Counter/Decorator Time…
更geek的有Decorator Log/Decorator Ani/Decorator Nothing…
3.:Condition Node(条件节点)
做各种条件判断的
条件节点很直白,它仅当满足Condition节点的条件时返回True。
4.:Action Node(行为节点,每个都是单独的任务)
行为节点是完成具体的一次(或一个step)的行为,视需求返回值。
而当行为需要分step/Node间进行时,可引入Blackboard进行简单数据交互。
log:输出文本到日志中
idle:停一段时间
直到返回一个成功的状态
wait
等一段时间后返回成功状态
注意:
整棵行为树中,只有Condition Node和Action Node才能成为Leaf Node(叶子节点),而也只有Leaf Node才是需要特别定制的Node;Composite Node和Decorator Node均用于控制行为树中的决策走向。(所以有些资料中也统称Condition Node和ActionNode为Behavior Node,而Composite Node和Decorator Node为Decider Node。)
更强大的是可以加入Stimulus和Impulse,通过Precondition来判断masks开关。
通过上述的各种Nodes几乎可以实现所有的决策控制:if, while, and, or, not, counter, time, random, weight random, util…
提示:可被打断
四、简单的敌人巡逻
1.can see (范围)
发现目标返回true
可以取反来进行更nb 的操作
只能对一个物体进行判断
如果想对多个物体,最好设置layer
2.前往
3.远离
五、【重点】自己重写:Action,Condition
action重写的为一个行为
condition重写的是一些判断
重写condition
1.创建脚本:
2.继承
3.重写相应的函数
4.返回成功和失败
5.使用
此时就可以在我们conditionals 里找到了