角色-角色控制器成对出现
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
调试过程中,鼠标放上去
调了一个小时才发现
这里没有断开,影响到了