按照我用过的行为树,说一下这个图里的逻辑。
1,顺序节点,从上往下,依次判断条件,有一个不满足返回false,这个顺序节点整体返回false,不执行行为。如果返回true,则继续往下判断。如果条件全部true,执行行为节点。
2,选择节点,从上往下,依次判断条件,有一个满足返回true,则跳过接下来所有的条件判断,直接执行行为节点。如果所有的条件节点都返回false,则整个选择节点返回false,不执行行为。
所以攻击节点是这样
1,视野内发现目标,且目标是玩家时,攻击,否则去巡逻或自卫,不执行报复性攻击
2,常规攻击返回true后,即进行了普攻,按照顺序进入报复性攻击的选择条件判断。当,1,发现目标,2,目标是玩家,3,怪物发狂,任一条件满足时,开始疯狂攻击
这个行为树写的有问题,报复性攻击那里的发现目标和目标是玩家应该放在一个顺序里,或者封装成一个发现玩家的条件判断。而且攻击、巡逻、自卫这三个行为也没有写之间的关系。他试图用行为树描述一个AI的行为,却忽略了一些基本规范,大概又自己脑补了一些规则,看起来很蛋疼。
PS:程序都是从上往下一行行执行的,一些概率选择也是让程序在执行顺序上跳过一些节点,严格说是没有所谓的优先级的。你想让一个行为优先出现,是通过把他的条件放到行为树的前端,让程序先去判断他的条件,以实现“一达到条件就执行”的效果
迪波威 1年前
IMMO 1年前
迪波威 1年前
IMMO 1年前
明宗 [作者] 1年前
然后再假装他写的是对的
1,是到攻击玩家这个序列中执行下一个节点,也就是报复性攻击
2,按照他的写法,巡逻本身是一个行为,等同于攻击,所以是这个行为结束后退出并返回true。假如这个巡逻是个封装好的节点,里面是有一些别的逻辑来控制的,这个图里没有体现出来
3,这三个节点之间应该是选择,分别有自己的判断条件,在这个图里,根据节点一层层往里面看,各自的条件都写在最右侧绿色的部分了
再说一下那个巡逻。
第一,整个判断逻辑有三个条件,1,视野内有玩家,2,被玩家攻击,3,其他,这个巡逻实际上就是其他,理论上应该放在最后,而不是放个什么“没有发现玩家”。
第二,巡逻的节点用的是选择,所以他的逻辑是先看“视野内没有目标”这件事是否为true,如果true,则这个节点就返回true,就不会做下面的“巡逻”这个行为;如果“视野内没有目标”为false,他才会去尝试做“巡逻”这个行为。
所以你看,这个写法本身就是错的,最开始我还以为他那个判断是序列。
顺便,他应该是想实现这样的逻辑:1,看到玩家了,上去打;2,在看到玩家的时候,发狂了,就提升攻击频率(然而没有定义发狂是什么);3,在视野外被攻击了,看自己的生命值,多就打,少就跑;4,没看到玩家,没被攻击,就巡逻
发布
明宗 [作者] 1年前
发布