AI原理
一、三大阶段
AI的处理过程可以分为三大阶段:感知、思考、行动
(1)感知
对AI当前状态作记录。
“基本过滤”也是一种感知行为。
基本过滤 - 如果其他感知的优先级更高,会忽略部分信息
(2)思考
AI利用感知阶段收集到的信息,对当前信息和目标进行评估,为之后的行动指明方向。
(3)行动
根据感知阶段的信息和思考阶段的决策,AI在行动阶段对信息做出相应的行为。
行动阶段结束后,AI会再次回到感知阶段。
行为有可见的,如跳跑;也有不可见的,如通信
二、创造AI角色
一个角色蓝图,一个AI控制蓝图
- 胶囊体——控制碰撞
- 网格体——控制骨骼、动画、材质
- Camera Boom——控制摄像机视图
- 角色移动组件——控制角色移动、游泳、飞行等动作
流程
1.制作AI蓝图
a.拷贝第三人称角色蓝图——删掉事件图表中所有的节点(因为AI不需要输入数据)
b.删除一些与输入有关的变量:“基础转动速率”、“基础俯仰速率”
c.删除摄像机组件:camera Boom(摄像机升降臂)、跟随相机
2.AI控制器
a.添加AI控制器 - 替换刚刚删除的玩家控制器的功能
b.建立AI控制器蓝图
c.打开AI_ThirdPersonCharacter蓝图——PAWN——AI控制器类——绑定AI控制器蓝图
三、寻路
AI需要信息和数据才能在场景中移动并躲避障碍。
在场景中寻路是AI的基本功能,不仅仅是从A-B点。
(一)寻路原理
- 计算路径
- 躲避障碍
- 寻路网格体 - 用于帮助AI在场景中寻路。网格体由大量凸多边形组成,规定了哪些区域AI可以通过。
- 预计算数据
寻路网格体都是预先计算(“烘焙”)好的,这意味着在游戏开始前,以2D网格体形式表示的寻路网格体就已经包含了场景对象和AI自身生成的碰撞数据。这就使得寻路的开销更低。对于那些代理数量或类型不确定的实时体验来说,这点尤为明显。
添加寻路网格体Actor
为了让AI使用预计算数据。
流程
- 模式 - 寻路网格体(Nav Mesh Bounds Volume)拖入场景 - “细节”面板调整笔刷尺寸 -
让网格体覆盖AI需要行走的场景
寻路网格体开销低、速度快、高可靠,可以快速实现导航功能,但是场景无法动态修改寻路网格体。
(二)配置寻路网格体
1.寻路网格体调整
寻路网格体大小不需要特别准确。
a.显示网格体 :视口选项 - 显示 - 导航(快捷键P)
b.默认网格体自动更新 - 移动场景物件,寻路网格体会实时更新。若关卡较大,会很耗性能。
c.(仅对较大关卡)关闭自动更新 - 编辑器偏好设置 - 关卡编辑器 - 杂项 - 关闭自动更新导航
d. 手动更新 - 构建 - 导航 - 构建路径(无需在意日志里的错误消息)
2.使用RecastNavMesh调整寻路网格体部分属性
创建寻路网格体时,Recast寻路网格体自动创建。
选中RecastNavMesh,在细节面板调整。
- 绘制偏移 - 抬升或降低寻路网格体。不会改变网格体实际位置,只是改变视觉效果。(对被遮挡的区域显示很有帮助)
默认为10。
- 导航修改器体积(Nav Modifer Volume) - 不会生成任何几何体。
- 导航网格体障碍 - 表现某片区域难通过。AI不会优先选择这个路径。不会移除导航网格体。
- NavArea_Null - 移除导航网格体,无法通过
。
- NavArea_LowHeight - 在高度不足的地方使用。无法通过。
- NavArea_Default - 可以通过。
(三)导航网格体代理
如果想要尺寸更大、游泳、飞行的角色,只需要定义新的寻路网格体代理,并进行相应设置以适应新的尺寸和运动形式。
- 代理 - 场景中任何形式的自主实体。这里泛指AI角色。
- 在RecastNavMesh中调整代理参数,可打开AI蓝图的胶囊体参数对照调整。
- 代理高度 - 会出现高度不够,但是可以通行的状况。修改后,变为不可通过区域。
- 增加代理类型和数量:项目设置 - 引擎 - 导航系统 - 代理
四、使用控制器让AI漫游
(一)蓝图编写漫游逻辑
给角色蓝图新建一个自定义事件,包含随机漫游逻辑 - 增加一个函数,在游戏中反复调用自定义事件
流程
a.AI行动
打开AI角色蓝图 - 在“事件图表”窗口右键创建“自定义事件custom event”,命名为“random wander随机漫游”- “随机漫游”后跟“到Location的简单移动Simple Move To Location”函数
- “到Location 的简单移动”的两个参数:
- Controller - 角色的控制器。
- Goal - 用向量表示的目标位置。
- Get controller - 会获取所绑定的对象,并返回该对象的控制器。
b.“Get controller获取控制器”函数返回值与“到Location的简单移动”的controller参数连接。
- “Get Random Reachable Point In Radius获取半径内能到达的随机点”参数:
- Origin起点
- Radius半径 - AI能到达的范围
- “Get Actor Location获取Actor位置” - 默认为自己。
c.随机漫游
“获取半径内能到达的随机点”起点为当前AI的位置:“获取Actor位置”函数的返回值连接origin - 调整半径为1000 - 返回值与“到Actor的简单移动”的Goal参数连接。
d.定时器循环
创建“begin play”事件 - 连到“set timer by event以事件设置定时器”函数 - random wander随机漫游事件连到“以事件设置定时器”函数的event引脚,设置开始时间time,勾选looping循环
运行游戏,AI会在1.5s后随机漫游
(二)寻路网格体和GamePlay调试器
游戏运行后,按“’”打开控制台。
- 可在项目设置 - 引擎 - 输入 - 控制台,添加快捷键
Gameplay debug“调试器”:检验AI能否在游戏中正确使用寻路网格体。
运行游戏,按快捷键弹出Gamplay调试器,可以看到寻路网格体在不断更新