Bootstrap

ue5 ai跟随玩家

角色-角色控制器成对出现
BP_NPC
在这里插入图片描述
AI_Control
在这里插入图片描述
如下
在这里插入图片描述
打开BP_NPC
在这里插入图片描述
骨骼网格体 skm_manny_simple
在这里插入图片描述
调整一下
在这里插入图片描述
动画类使用ABP_MANNY
在这里插入图片描述

打开ABP_MANNY
搜索节点try get pawn owner
在这里插入图片描述
增加这三个节点,判断是不是AI控制
下图:
如果是玩家控制,输出true,玩家控制继续移动
如果是AI控制,输出false,AI控制继续移动

在这里插入图片描述

打开BP_NPC 点击类默认值,搜索pawn,找到AI控制器类,换成我们的AI_Control
在这里插入图片描述
pawn的自动控制AI,在什么时候进行控制
在这里插入图片描述

拖拽导航网格体体积,把整个场景包裹住
在这里插入图片描述

按下p
绿色就是AI可以到达的地方
在这里插入图片描述
保存一下

打开刚才BP_NPC的角色蓝图,来到事件
在这里插入图片描述

这样npc就会朝玩家走过来
在这里插入图片描述

在这里调整npc的速度
角色移动组件-》最大行走速度
在这里插入图片描述
选中根组件,搜索rotation,把yaw这个勾去掉
原理:第一人称,玩家控制
否则,npc转弯很生硬
在这里插入图片描述

在这里插入图片描述

把我们的BP_NPC拖进去
在这里插入图片描述

点击运行,npc回朝着玩家位置移动。
但是只执行一次
在这里插入图片描述

npc一直移动,就要连这个event tick (隔几毫秒调用一次)
在这里插入图片描述
我玩家在哪里,npc跟到哪里
在这里插入图片描述

总不能像狗皮膏药黏在背上

2.行为树控制AI
在这里插入图片描述

人工智能,行为树,取名BT_NPC
在这里插入图片描述
在这里插入图片描述

人工智能,行为树,取名BB_NPC
黑板是行为树的全局变量,对外通信
在这里插入图片描述
在这里插入图片描述

打开行为树,配置黑板为我们的BB_NPC
在这里插入图片描述
点击右上角,切换行为树和黑板
在这里插入图片描述

拽出selector
在这里插入图片描述
再拖一个sequence
在这里插入图片描述
在这里插入图片描述

保存 行为树就配置好了

npc移动到随机点

新建文件夹取名Tasks
在这里插入图片描述

打开行为树
新建任务,取名BTTask_MoveToRandomLocation,放在文件夹Tasks
在这里插入图片描述
打开刚才的任务,它有6个函数可以重载
在这里插入图片描述
把这个拖出来
在这里插入图片描述
半径内可达到的随机点 get random
在这里插入图片描述
因为有些地方上不去,所以使用半径内可达的随机点
在这里插入图片描述
get actor location
在这里插入图片描述
然后这样,把可编辑实例勾上

在这里插入图片描述

拖出aimoveto
然后把范围提升为变量,可编辑实例勾上

意思:npc进入半径内就算到达
完成时,返回成功或者失败
在这里插入图片描述
如图
在这里插入图片描述

最后长这样,不要连错
在这里插入图片描述

回到行为树,搜索move to选中刚才创建的任务
在这里插入图片描述
在这里插入图片描述
你看任务中的两个变量在这里,细节中也有
**加粗样式
**

打开npc,删掉之前的控制逻辑
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

打开我们的AI_Control
在这里插入图片描述
进入图表,运行行为树,选中我们的行为树
在这里插入图片描述

保存npc,运行npc就会自己跑了
在这里插入图片描述

npc现在只会移动到随机点。没有思想啊

打开AI_Control
在这里插入图片描述

我们这里选择AI感知组件
AI告知刺激源:人,物品
AI感知组件:人
在这里插入图片描述
细节面板添加视力配置
在这里插入图片描述
视线半径:可以看3000米
失去视线半径:3500米就再也看不见了
周边视角半径:视角半径,50度吧。猫咪180度,驴360度
到上个已见位置的自动成功范围:默认就好、
比如2m 我躲到墙后,ai_npc在我丢失那个点2米范围,它依然能看到

这两个成对使用
视点向后偏移:把眼睛完后挪2米
在npc背后2米,npc也能看到
接近剔除半径:去除2米,不能让npc看到

调试颜色
最大年龄
开始点已启用
在这里插入图片描述

接下来完成这个功能
现在npc已经有了视力。它看到我们就会记录我们的位置。并且把值放在黑板
目标感知更新时
在这里插入图片描述
年龄
过期年龄:听到声音后多久忘记

在这里插入图片描述
添加一个函数 专门处理视觉 HandleSightSense
在这里插入图片描述
选择它,输入,添加两个参数
在这里插入图片描述

我们只要视觉感官
在这里插入图片描述
判断一下是不是玩家节点
在这里插入图片描述
然后弄成这个样子
在这里插入图片描述

复制1这个名字TargetActor
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ai跟丢了,把它最后看到我们的位置记录下来
在这里插入图片描述

复制名字LastKnowLocation
新建向量
在这里插入图片描述

这一串张这个样子
在这里插入图片描述
回到事件图表,把刚才的函数连起来
在这里插入图片描述

运行以后按下 单引号 ‘
调试信息
这个是行为树
这个是黑板
按下键盘4,视觉感官。npc看到我们,身体上就有一个绿色小球
在这里插入图片描述
注意看,黑板里面的值,当npc看到我们,就有值
在这里插入图片描述
现在npc已经有了视力。它看到我们就会记录我们的位置。并且把值放在黑板

在sequence添加装饰器,黑板
在这里插入图片描述
选中黑板,黑板键 TargetActor
在这里插入图片描述
把这里改成未设置
意思是 当TargetActor值为空,就向下执行
在这里插入图片描述
把这里选择self
意思: 当TargetActor值为空,流程就终止。回到selector
在这里插入图片描述
移动到玩家位置
在这里插入图片描述

只要发现玩家就执行,跑到玩家那里。如果跟丢了,就终止这个流程
在这里插入图片描述

npc发现玩家,就去跟。跟丢以后就移动到最后看到玩家的位置![](https://i-
在这里插入图片描述
当前已实现npc追逐玩家
在这里插入图片描述

装饰器
黑板 loop 冷却
就是if else break

如何自定义装饰器
新建装饰器 取名BTDecorator_CheckScale 保存

执行条件检查AI
在这里插入图片描述
新建变量 黑板键 眼睛睁开
按住ctrl,把它拖进去
在这里插入图片描述
在这里插入图片描述

把它提升为变量,命名MaxAcceptableScale
在这里插入图片描述
意思:检查玩家体型的大小
玩家z轴小于多少就返回成
在这里插入图片描述

添加我们的自定义装饰器
在这里插入图片描述
在这里插入图片描述

意思是体型大于1.5就不追,打不过

删掉这个玩家出生点
在这里插入图片描述
在这里插入图片描述
放大3倍
在这里插入图片描述
搜索pawn,自动控制玩家改成玩家0
在这里插入图片描述

运行一下,npc不敢追逐玩家,但是会围着打转
因为它看到它就会跟过来,但是我们体型很大,它不能追
在这里插入图片描述
点这里的反转,就会翻过来
在这里插入图片描述

给ai npc添加听觉
**加粗样式
**
在这里插入图片描述

添加一个感官 AI监听配置
在这里插入图片描述
在这里插入图片描述

添加一个函数,取名HnadleSoundSense
在这里插入图片描述
添加2个输入
actor:谁发出的声音
stimulus:刺激源:声音还是视觉
在这里插入图片描述
输入hear
在这里插入图片描述
把声音来源,记录到黑板中
在这里插入图片描述
添加要给变量,取名SoundTargetLocation
在这里插入图片描述

搜索get blanck
在这里插入图片描述
然后这样
在这里插入图片描述
这个就是黑板那个
在这里插入图片描述
搜索这个
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这样就把声音来源,存放到黑板
在这里插入图片描述

在这里插入图片描述

回到事件图表
在这里插入图片描述

把函数拖出来连接
在这里插入图片描述

现在ai npc已经可以听到声音来源位置,但是不会有任何反应
我们来到行为树
在这里插入图片描述
添加一个黑板装饰器在这里插入图片描述
选择声音来源
在这里插入图片描述
当黑板里面有值了,就中止
在这里插入图片描述
听到声音,让ai npc移动到声音的位置
到地方以后等3秒
在这里插入图片描述
然后清空黑板里面的声音位置

新建任务,取名BTTask_ClearBlackBoardValue
在这里插入图片描述

在这里插入图片描述
新建变量 BlackBoardKey
在这里插入图片描述
拖出来 ctrl+鼠标左键
搜索clear
在这里插入图片描述
清空以后保存,返回成功
在这里插入图片描述
选择刚才的任务
拖出来,选择刚才的
在这里插入图片描述
声音这块就完成了
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/13cf6af8a5e442b58c88cb4fe21b33e0.png
在这里插入图片描述

现在npc已经可以听到声音,就跑到声音发出位置,3秒以后清空黑板中该位置

我们现在添加一点声音,给npc测一下

我们来玩家的蓝图
在这里插入图片描述
选择事件着陆时
在这里插入图片描述
当角色着陆时发出噪音
在这里插入图片描述

instigator煽动者 我们自己发出的声音
在这里插入图片描述

npc会跑到,我们落地的地方
在这里插入图片描述
声音的位置在这里
在这里插入图片描述

但是它也看到我们了
在这里插入图片描述

在这里插入图片描述

让ai按照路径巡逻
新建蓝图类,取名BP_ControlPoint
在这里插入图片描述
添加静态网格体,设置为圆柱
在这里插入图片描述
大小合适
在这里插入图片描述
给它新建一个材质 取名m_debug
在这里插入图片描述
在这里插入图片描述
添加颜色
按住3,鼠标点击
在这里插入图片描述
随便设置一个颜色
在这里插入图片描述

不透明度0.3
在这里插入图片描述

在这里插入图片描述

拖4个
在这里插入图片描述
把碰撞预设,设置为无碰撞
在这里插入图片描述

如何让npc 找到巡逻点
新建actor组件
在这里插入图片描述
在这里插入图片描述

新建变量PatrolPath,类型就是刚才那个蓝图
在这里插入图片描述
在这里选择映射 就是map容器的意思
在这里插入图片描述
左边是已我们创建的蓝图为键,右边是浮点
在这里插入图片描述
打开BP_NPC
在这里插入图片描述
把组件交给npc
在这里插入图片描述
找到我们挂载的组件的
在这里插入图片描述
用吸管吸取这个
在这里插入图片描述
给它设置停留时间
第一个点0秒
第二个点1秒
第三个点2秒
在这里插入图片描述

现在npc可以识别巡逻点了
我们打开行为树
拖出select,新建任务
在这里插入图片描述
名字叫patrol
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

获取到巡逻点
在这里插入图片描述
新建变量
在这里插入图片描述
新建自定义事件
moveTOPatrolPoint
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
把它提升为变量,方便调用
在这里插入图片描述
取名AICharacter,眼睛睁开
在这里插入图片描述
拖出来连接
在这里插入图片描述
在这里插入图片描述
就是这样
自定义事件 onEndWait
在这里插入图片描述
连接线太长在这里插入图片描述

我们需要获取巡逻时间

在这里插入图片描述

通过键来查找值。即找停留时间
在这里插入图片描述

到下一个巡逻点
在这里插入图片描述
就是它
在这里插入图片描述

这里也需要调用MoveToPatrolPoint
在这里插入图片描述
写完了

先判断巡逻点,不为空就走过去
在这里插入图片描述

先走到第一个点,然后等待巡逻时间
这个变量是数组索引,我写错了,应该写成curPatrolIndex
所有的键值就是数组
在这里插入图片描述

走到第一个点,索引为0,然后获取等待时间
在这里插入图片描述

等待完成后,索引加1.走向下一个巡逻点
在这里插入图片描述
整体长这样,这里千万不要连接错
在这里插入图片描述

索引值一直就数组越界了,怎么办

如果索引没有越界,就自加1
如果越界就清零0,走向第一个点
在这里插入图片描述

把任务拖进行为树
在这里插入图片描述
可以运行看一下
先把感官断开
在这里插入图片描述

把这里也断开
体型小就黏过去
在这里插入图片描述

走在第一个点就不动
因为第一个点巡逻时间为0
在这里插入图片描述
回到刚才的巡逻任务中
添加一个max
在这里插入图片描述

调试过程中,鼠标放上去
在这里插入图片描述
调了一个小时才发现
这里没有断开,影响到了
在这里插入图片描述

;