一个游戏DEMO的AI部分
用到行为树组件如上
主要说一下这两个组件
一个装饰(类似过滤器) 一个服务(代码逻辑与Blackboard交互)
Service分为 大碰撞 和 小碰撞 两个碰撞范围, 大碰撞用来跟踪, 小碰撞用来中断跟踪开始攻击
IsTarget检查
大碰撞
小碰撞
执行间隔
执行结果关键部分截取
看出问题了么?
我的角色在抽筋似的反复转向
原因就是因为Service的执行时间是根据设置的那个间隔来的, 而跟行为树的轮播调用没有关系
行为树开始新一轮执行,如果此时跟上一轮的间隔时间没有到设置的时间,Service是不会执行的
但是如果行为树执行到一半,Service的时间间隔到了,那么Service也是会立刻执行的
所以原代码中, 我在Service里面直接修改了Blackboard的内容
恰好行为树执行到一半, 读取到我修改的值, 导致AI本来向player移动的, 变为了向NPC移动
然后因为我有player first原则, Blackboard的值又立刻变为了player, 导致AI在原地不停的转向
改进后代码 大碰撞
临时变量用来存放循环时的值, 这样在循环的时候不会更改黑板的值, MoveTo在取值的时候就不会被这边的循环干扰
角色就不会在游戏中抽筋似的反复转向