虚幻引擎的 寻路系统(Navigation System) 向人工智能代理提供了寻路功能。为了能够找到开始位置和目的地之间的路径,从世界的碰撞几何结构生成了寻路网格体。
默认设置将寻路网格体细分为图块,以允许重建寻路网格体的本地化部件。生成的网格体由一些多边形组成,每个多边形都指定了成本。确定最优路径时,寻路算法将尝试确定成本最低的路径前往目的地。
寻路系统包含各种组件以及用于修改寻路网格体生成方式的设置,包括多边形的成本。这进而影响代理在你的关卡中寻路的方式。
通过本实例将学习如何使用 寻路修饰体积、寻路代理链接 以及在运行时影响寻路的蓝图Actor来修改寻路网格体
使用寻路修饰体积改变特定区域中的寻路网格体成本
使用寻路代理链接在本来不可达的两个区域之间创建连接
使用智能代理链接以允许代理在平台之间朝着目标跳跃
创建移动的蓝图Actor以学习如何在运行时动态重新生成寻路网格体 需要先完成AI_寻路系统_修改寻路网格体__上
寻路修饰体积
使用体积形状将寻路区域类应用于寻路网格体。这可以用于更改体积空间中的多边形的属性,以修改其遍历成本。
多边形属性由寻路修饰体积的相应 区域类 定义。此类确定对寻路网格体的影响。你可以使用内置类修改网格体,或创建自己的自定义实现。
一、你将首先使用内置类修改关卡中的寻路网格体。
1、转到 放置Actor(Place Actors) 面板,搜索 寻路修饰体积(Nav Modifier Volume)。将寻路修饰体积(Nav Modifier Volume)Actor拖到关卡中。注意,默认情况下,任何寻路网格体都不在体积内生成
移动 和 缩放 体积以覆盖如下所示的区域。注意,你现在会在关卡左侧移动体积,强迫代理到达底部 球体。此区域可以表示游戏中不允许代理跨越的任何障碍物。
2、、重复上一步,并在地图另一侧创建另一个区域。缩放体积时,请在代理两侧保留活动空间。
3、、将另一个 寻路修饰体积(Nav Modifier Volume) 拖到关卡中。浏览到 细节(Details) 面板并点击 区域类 旁边的 下拉列表。从列表中选择 NavArea_Obstacle 类。此内置类在体积内将指定相较于默认值(绿色的 NavArea_Default )更高的成本。这样一来,代理会避开该区域,除非代理找不到成本更低的路径。
4、、复制体积两次,以围绕球体构造以下形状。这将强迫代理绕着体积走来到达球体。
如果使用另一个体积完全阻挡球体周围的区域,代理仍将到达目的地,因为这些体积表示有效路径。相反,如果将体积的区域类更改为NavArea_Null,代理将无法到达目的地,因为代理找不到通往目标的合适路径。这是因为NavArea_Null应用了无限成本,从而导致寻路网格体不在受影响的区域中生成。
5、点击 模拟(Simulate),并注意代理如何在球体之间移动。这演示了你的更改会如何影响寻路网格体的生成方式。
效果如图:
学习了如何使用 寻路修饰体积(Nav Modifier Volumes) 更改寻路网格体的生成方式。你还学习了虚幻引擎中可用的一些内置区域类。
二、使用寻路链接代理
寻路链接代理 能将寻路网格体中没有直接寻路路径的两个区域连接起来。在搜索路径的同时,寻路链接代理会用作额外连接,供代理用于到达目的地。
寻路链接代理常用于在使用不同寻路网格体的区域之间搭桥,并告知代理,在没有连续寻路路径可用时,代理可从平台降落或跳向目标。
创建桥梁以连接两个区域
1、选择第一个 寻路修饰体积(Nav Modifier Volume),并调整其大小,使其覆盖整个地板长度,如下所示。这将阻止代理到达关卡中的底部球体。
2、转到 放置Actor(Place Actors) 面板并将 立方体 Actor拖到关卡中。将其缩放为X = 4、Y = 1、Z =0.2,并按如下所示进行放置。
3、复制 立方体 并将其移至关卡另一侧,如下所示。
这些立方体Actor充当关卡中寻路链接代理的可视表示。你不需要将其与寻路链接代理一起使用。
4、转到 放置Actor(Place Actors) 面板,并搜索 寻路链接代理(Nav Link Proxy)。将 寻路链接代理 Actor拖到关卡中。
5、选中 寻路链接代理 后,点击 PointLinks[0].Left 句柄并将其移动,使其放在网格体一侧。点击 PointLinks[0].Right 句柄并将其移动,使其放在网格体另一侧,如下所示。
如果寻路链接代理未与寻路网格体表面连接,绿色箭头将消失。
现在你已创建连接,代理将能够通过 寻路链接代理 寻路,尽管中间并未寻路数据。
6、选中 寻路链接代理 后,转到 细节(Details) 面板,并展开 指针链接(Point Links)下标记为 0 的分段,以找到 方向(Direction) 下拉列表。可以选择让 方向(Direction) 为 双向(Both Ways)、从左到右(Left to Right) 或 从右到左(Right to Left)。对于本示例,选择 从左到右(Left to Right)。
7、复制 寻路链接代理,并将其移至关卡另一侧。对于本示例,将 方向(Direction) 设置为 从右到左(Right to Left)。
8、点击 模拟(Simulate),并注意代理现在可以通过从左侧进入并从右侧退出来到达 球体。
测试发现未过去,查找原因,发现必须有这种箭头才算成功。
选中时是这种状态:
通过以上步骤学习了如何使用了寻路链接代理 来连接 寻路网格体 中没有可行路径的两个区域。你还学习了,可以配置 寻路链接代理 以使用不同的方向,如 双向(Both Ways)、从左到右(Left to Right) 或 从右到左(Right to Left)。
运行效果如图:
使用寻路链接代理允许代理从平台落下
将另一个 寻路链接代理 拖到关卡中,并将其放在升高平台的边缘,选中 PointLinks[0].Left 并将其放在平台边缘,选中 PointLinks[0].Right 并将其放在底部,与地板重叠的地方。找到 细节(Details) 面板,展开 指针链接(Point Links) 下标记为 0 的分段,并选择 从右到左(Right to Left) 作为 方向(Direction)。
效果如图:
使用 寻路链接代理 让代理从平台落下以到达目标完成。
使用寻路链接代理允许代理跳到目标
使用 寻路链接代理 上的 智能链接,允许代理在不同平台之间跳跃。
1、选择平台网格体,在按住 Alt 键的同时将其拖到一侧以进行复制。
2、调整新平台大小并将其移至更高的位置,
3、复制 球体 Actor并将其放在平台之上
4、在 内容浏览器(Content Browser) 中,右键点击并在 创建基本资产(Create Basic Asset) 分段中选择 蓝图类(Blueprint Class)。在 选择父类(Pick Parent Class) 窗口中,转到 全部类(All Classes) 分段,并展开箭头。搜索并选择 寻路链接代理(Nav Link Proxy),然后点击 选择(Select)。将蓝图命名为 BP_NavProxyLink。
5、双击打开 BP_NavProxyLink 。在 事件图表(Event Graph) 中右键点击,然后搜索并选择 事件接收智能链接已到达(Event Receive Smart Link Reached)。
6、从 Event Receive Smart Link Reached 节点的 代理(Agent) 引脚拖出,然后搜索并选择 投射到角色(Cast to Character)。
7、从 Cast to Character 节点的 作为角色(As Character) 引脚拖出,然后选择 提升到变量(Promote to Variable)
8、从 As Character 节点的 执行 引脚拖出,然后搜索并选择 建议发射物速度自定义弧(Suggest Projectile Velocity Custom Arc)。
9、从 As Character 节点的 蓝色 引脚拖出,然后搜索并选择 获取Actor位置(Get Actor Location)。将 *Get Actor Location** 节点的 **返回数值(Return Value)** 引脚连接到 **SuggestProjectileVelocityCustomArc ** 节点的 **开始位置(Start Pos)** 引脚。
10、从 Event Receive Smart Link Reached 节点的 目的地(Destination) 引脚拖出,并将其连接到 SuggestProjectileVelocityCustomArc 节点的 结束位置(End Pos) 引脚。
11、将 作为角色(As Character) 变量拖动到 事件图表(Event Graph) 中,然后选择 作为角色获取(Get As Character)。从该节点拖出,然后搜索并选择 启动角色(Launch Character)。启用 XYOverride 和 ZOverride 复选框。
12、从 SuggestProjectileVelocityCustomArc 节点拖出,然后搜索并选择 延迟(Delay)。将 时长(Duration) 设置为0.1。将 Delay 节点的 已完成(Completed) 引脚连接到 Launch Character 节点。
13、从 SuggestProjectileVelocityCustomArc 节点的 向外启动速度(Out Launch Velocity) 引脚拖出,然后搜索并选择 向量 * 浮点。
14、将 Multiplication 节点的 黄色 引脚连接到 Launch Character 节点的 启动速度(Launch Velocity) 引脚。右键点击 Multiplication 节点的 绿色 引脚,然后选择 提升到变量(Promote to Variable)。
15、选择 New Var 0 节点后,转到 细节(Details) 面板,并将变量重命名为 JumpBoost。将默认值设置为 1。启用 实例可编辑(Instance Editable) 复选框,如下所示。编译并保存。
16、选择关卡中的 BP_NPC_ModNavMesh 角色,并在 细节(Details) 面板下点击 目标列表(Target List)旁边的 添加(+) 按钮,以添加新条目。搜索并选择您上次添加到平台的 球体(Sphere)Actor。
17、将 BP_NavProxyLink 蓝图Actor拖到平台上并调整连接,如下所示。
18、选择 BP_NavProxyLink 蓝图Actor后,转到 细节(Details) 面板,并点击 将端点从简单链接复制到智能链接(Copy End Points from Simple Link to Smart Link) 按钮。启用 智能链接有意义(Smart Link Is Relevant) 复选框
点击 模拟(Simulate),并观看代理现在如何跳跃以到达上一个球体。
通过创建自定义 寻路代理链接 蓝图,掌握如何将其用于让代理跳跃到平台。