一、创建AIcontroller的蓝图类,行为树BehaviorTree和黑板Blackboard
在创建蓝图类里搜索AIController即可找到ALcontroller类
黑板和行为树都在右击内容浏览器的Artificial Intelligence里
二、在AIcontroller里绑定行为树
BTAsset为AI controller绑定的行为树,我的理解是AIcontroller使用行为树来进行对AI的控制,所以AIcontroller里可以什么都没有,将所有的控制内容全部放在行为树里即可。
三、在黑板里放入变量
newkey添加变量,这里面的变量相当于AIController的变量,不过我们不用AIcontroller,就将行为中需要的变量放在黑板里。
四、行为树中添加内容
- Task(任务):控制AI执行任务
- Decorator(装饰器):大多用于判断节点(相当于行为书中的Branch)
- Service:用于检查和更新黑板的数据
1.Decorator
我的这个装饰器是用来检测AI周围是否有玩家
先在左边的function里重写(Override)Perform Condition Check AI,就会生成一个头节点和一个尾节点,尾节点把return value勾选可以将这个装饰器蓝图类里的公开的成员变量暴露出去给其装饰节点
一般装饰器作为判断节点都要有参数作为判断条件,比如这里我的参数是TargetPlayer就setBlackBoardvalueasObject(我这Target Player是个对象所以采用Object)将key节点提升为变量并将其变成public变量(就是将左边的浏览器里的此变量的那个眼睛打开,这个眼睛打开就是将这个变量变成public变量并允许returnvalue暴露出去。)在行为树中装饰器也要将Target Player绑定到对应的黑板变量(点击装饰器左边的details里default里进行绑定)
如果你和我一样是对Object进行检测,别忘了在黑板中将对应的变量进行更具体的分类,比如我这里的就是Third PersonCharacter类
这里注意看我的行为树里装饰器下的装饰节点(在添加装饰器的里面有个blackboard,选那个就是相当于给这个sequence进行判断,如果这个blackboard节点的判断条件正确则执行,如果失败则按顺序进入同层下一个sequence
2.Service
重写Event Receive Tick AI(和普通蓝图类里的TickEvent差不多都是每帧判断)和装饰器一样将变量暴露出去,只不过他不需要return value。
3.Task
Move To 和Wait都是自带就有的,你也可以自己写自己需要的Task比如我这里的AIAttack
重写Event Receive Execute AI
我这里是让我的小鳄鱼(AI)执行一个攻击的动作(动作在小鳄鱼的character类里,是个自定义事件)
task结束记得假上Finish Execute sucess打勾才能执行行为树的下一个Task。
注意MoveTo需要有可移动范围,如下图所示将Nav Mesh Bound Volume 拖入场景就行(按P显示其可移动范围)