1.复制一份新的Task任务,修改PlayController,改为OwnerController,同时修改
Radius的值,修改为150,表示随机范围移动
2.在黑板中添加变量,是否看到(bool),然后在行为树中,在Sequence右键,添加装饰器(设计),设置变量值为是否看到,设置为否,下方修改为1写好的随机移动任务
3.在selector另一边填写之前写好的找玩家的方法.并也添加一个装饰器(黑板),并设置为true,其实就是ifelse.
4.行为树就这些,打开AI,并添加上视觉感知(AIPerception),右侧AIPerception中SensesConfig(感官配置),加号添加一个AISightconfig(AI视觉配置),打开,并在Detection by Affiliation(隶属侦查,就是侦查什么类型的Pawn)
把三个都选了,敌方Enemies,友方Friendile,Neutrals中立方
5.打开被看到的,也就是第三人称角色类,添加一个被看到的组件AIPerceptionStimuliSource,并添加一个SenseSight
行为树
判定是否看到了玩家
回车键左边的""键,即可打开VR调试模式,
有些情况下需要中断当前任务,Decorator的ObserverAborts值为Self时,可以立刻终止所在节点的任务和子任务,值为LowPriority时,那么当执行处于较低优先级子树时,这个Decorator节点的Observer被激活,如果满足条件使得执行可以移动到较高优先级子树.较低子树将立即中止,跳转到这个Decorator所在的节点。值为Both时所在节点和低优先级节点都会被中断。
这时,我们把没看到玩家,设置为self,一旦看到,立刻打断,看到玩家设置为Both,一旦没看到,当前和低优先级的也会被打断.
打开AiPawn中的由控制器控制旋转上,这个是我们控制ai,使得控制器转向一致,不需要这个,去掉,然后打开Pawn中的移动控制器,把朝向转向打开,这样转向就会平滑
此处加上cooldown(冷却时间)使得移动不会判定过快而抽搐
1先建立一个Actor类,然后在里面建立一个Vector数组变量,可编译并且带有3D演示实例,并且在世界上设置任意点位置
2在放到世界的Pawn类NPC中,添加一个1中自定义的Actor类的引用,然后设置为可编译,并且在世界中给它赋值
3新建一个任务类,并添加两个blackBoardKeySelector,命名为PointArr,和PointArrIndex,设置为可编辑实例,然后再新建一个,添加一个PointArrIndex类型变量.设置同上
4.写法上思路就是当控制器接收AI的时候,转换为Npc类,然后获取其中的数组,并获取本身位置TransformLocation,加上设置的位置,等于世界上的实际位置.此处是根据下标记获取了实际的位置,另一个任务就很简单了,做一下下标的++即可,不超过实际,超过就重置,不超过就++
循环简单,如图创建一个bool值,在黑板中纪录,在任务中实现,在AI中初始化
思路:黑板建立一个Int变量,1的时候正向,-1的时候反向,设置初始值为1(注意,循环应取消勾选)
正向反向思路相似,如图下