AI的三大阶段
AI的处理过程可以分为三大阶段:感知、思考、行动
感知
- 对AI当前状态作记录。
- “基本过滤”也是一种感知行为。
- 基本过滤 - 如果其他感知的优先级更高,会忽略部分信息
思考
AI利用感知阶段收集到的信息,对当前信息和目标进行评估,为之后的行动指明方向。
行动
- 根据感知阶段的信息和思考阶段的决策,AI在行动阶段对信息做出相应的行为。
- 行动阶段结束后,AI会再次回到感知阶段。
- 行为有可见的,如跳跑;也有不可见的,如通信
导航网格
创建
快捷键P可以切换导航网格是否显示
导航网格的介绍
AI的移动范围,在放置模式下体积中有一个导航网格边界体积,把他拉到场景中形成一个线框,对其缩放形成AI移动范围
导航网格分为静态和动态
- 静态:游戏运行之前就以及计算好了,导航网格的面积
- 动态:游戏运行时,实时计算导航网格的面积
导航网格的静态和动态设置:关卡编辑器中设置——项目设置——导航网格体——运行时——运行时生成(默认静态),采用动态的方式则实时计算,更加符合智能调整;
使用RecastNavMesh调整寻路网格体部分属性
创建导航网格体时,Recast导航网格体自动创建。
选中RecastNavMesh,在细节面板调整。
- 绘制偏移 - 抬升或降低寻路网格体。不会改变网格体实际位置,只是改变视觉效果。(对被遮挡的区域显示很有帮助)
默认为10。
导航修改器体积(Nav Modifer Volume) - 不会生成任何几何体。
导航网格体障碍 - 表现某片区域难通过。AI不会优先选择这个路径。不会移除导航网格体。
NavArea_Null - 移除导航网格体,无法通过。
NavArea_LowHeight - 在高度不足的地方使用。无法通过。
NavArea_Default - 可以通过。
创建AIController
让角色绑定控制器
获取黑板中的变量
Get Blackboard:获取黑板
Set Value as ...(...为值的类型) :通过赋值的方式获取黑板中的变量值
Make Literal Name:为那个值赋值(value中时变量名)
作用
运行行为树
Run Behavior Tree:运行行为树(BTAsset:运行哪一个行为树)
行为树(与黑板一起使用)
控制并显示AI的决策制定过程
创建
行为树要与黑板一同使用,绑定黑板。
行为树结构
- 行为树:是一种将AI在场景中决策制定模型可视化的方法。
- 观察行为树的可视化结构,可以清晰地了解行为树的执行方式和执行顺序,而不必了解每个节点的具体工作方式。
- 执行顺序 - 由行为树中各个节点的位置决定。从上到下,从左到右。
- 树最终以task结尾。
合成
合成是AI执行分支的根。不会像叶节点那样执行,但能创建一个结构,并根据其子节点的成败控制顺序。
- Selector:选择器合成 - 会执行它下面的子节点。
- 试图选择最合适的任务 -子节点返回成功,选择器成功。所有子节点返回失败,选择器失败。(只要有一个任务成功,则成功。所有任务失败,则失败。)
- 第一个分支返回false 则执行下一个分支,直到有一个分支返回true 这个Selector节点执行完毕
- 可以把优先级最高的任务放在左边。
- Squencer合成 - 序列合成节点会按照序列顺序遍历子节点,当且仅当所有子节点返回成功,它才成功。如果某个步骤执行失败,它失败。
- 第一个分支返回true,则执行下一个分支,直到有一个分支返回false
- Simple Parallel:并行
任务节点
Task: 行为树具体的执行节点, 可以理解为一个角色当前的动作,可以执行一帧就返回,也可以持续一段时间
- 行为树的一种节点,下面无法添加其他节点。
- 是行为树分支的终点(但不是行为树的终点!)。
- 也被成为“叶节点”
任务状态 :成功、失败、执行。(无论失败与否,都会执行下一个节点。顺序从左到右。)
按New Task后自定义任务,自定义任务的事件
完成任务(必需要有这个节点,否则会卡在当前任务,无法继续执行下去)
设置变量
装饰器
装饰器: 可以理解为Task的条件判断,条件为true才会执行Task
添加装饰器
装饰器相当于if,满足条件执行一个任务,不满足条件执行另一个任务
- 行为树的执行逻辑是从左向右,观察器中止,可以这样理解,
- Self就是能打断自身
- Lower Priority就是能打断右边的节点
- Both是两者都有
- 当执行第二个节点的时候,第一个节点的装饰器满足条件了,Lower Priority 就会打断第二个节点执行,执行自身,
- 当执行第一个节点时,如果Actor结果改变时,Self就是打断当前的Task 从头开始播放,也就是RunEQSQuery
- Both是两种情况都能打断
服务
可以理解为和节点进行绑定,当执行这个节点下的状态时,这个服务会以一定频率一直运行
创建服务
自定义服务(New Service)
重载函数执行顺序:节点上挂有循环的装饰器
当执行到当前服务节点时,执行顺序
----- 先执行事件接收搜索开始AI
----- 再执行事件接收启用AI
---- Loop过程中会执行事件事件接收搜索开始AI
----- 结束节点会执行事件接收停用AI
结合
任务和合成可以创建出各种方法来处理AI的行为。
不必纠结如何完成任务,只需制定决策完成任务即可。
属性
BlackBoard:黑板中的变量是否发生变化
Composite:组合多个布尔值
Cooldown:等5s后在执行
黑板(与行为树一起使用)
可以看做是行为树的创建一些公有变量,外部可以修改行为树黑板的变量值,达到修改行为树状态的逻辑
创建
黑板中创建变量
EQS环境查询系统
EQS(Environment Query System) - 让AI能将多种环境因素考虑在内,要配合导航网格使用
创建
界面
以Points :Circle举例:在查询着周围生成环形的物体{
Cricle Radius:环形半径
Space Between:每两个点之间的距离
Number Of Points:点的数量
}
效果图
EQS进行测试
Disance:距离测试
Pathfinding:两者之间是否存在通路
添加测试后
具体属性
Test Purpose:测试目的(Filter Only:过滤,Score Only:打分)
Score EQuation:打分机制(Liner :离得越近分越低,Inverse Liner:离得越远分越高,Square:成平方趋势变化)
创建EQS角色(用于测试EQS),创建后放置在场景中
在测试角色中选择要测试那个EQS
在蓝图中通过“Set Named Param”节点设置您添加的这个参数,它的目标是一个 EQS 实例引用,您可以从“Run EQSQuery”节点获取它。
行为树中关联EQS
实例
射线检测:LineTraceByChannel(由通道检测线条){
Start: 起始点(玩家摄像机世界坐标)(First Person Camera+GetWorldLocation)
End:终点:getforwardvector获得向前向量*距离+当前位置(GetWorldLocation)=终点位置
Draw Debug Type:是否可以看到射出的射线(可选项为None无,For One Farme一帧一条,For During 持续时间保留,在展开位置设置时间)
Actors to Ignore:忽略的对象
Trace Channel:在节点中有Visibility和Camare两种,要让射线检测能识别到这个碰撞到的物体,则在待检测物体细节面板碰撞部分开启对应通道,因此要把对应待检测物体相关通道设置为阻挡与射线检测通道一致,就可以进行射线检测识别了
}
Make Arry:创建一个数组
设置一个装饰器变量