|
启用环境查询系统
Edit Menu -> Editor Preferences
Experimental
向下滚屏到 AI
启用 环境查询系统
场景查询的部分
场景查询 实际上由诸多不同部分组成。必须从行为树调用一个场景查询,之后实际的场景查询将使用其生成器、引用其 Context、并通过其测试为行为树提供最高的加权结果。
行为树
通过 Run EQS Query Task 节点即可在行为树中使用场景查询。
在行为树中将其选中即可设置 Query Template 属性(场景查询资源)、设置其 Query Params 属性(即为传入场景查询资源的命名数值)、以及设置最高加权结果返回的黑板键(对象或矢量)。
如需了解其使用的详细内容,请查阅 行为树 文档。
场景查询
使用 Run EQS Query 节点在行为树中调用的便是场景查询(Environment Query)资源,以便对多个 Actors 或位置进行测试,找到“最佳”的选择。而“最佳”的定义取决于测试在场景查询中的构成方式。
场景查询可在蓝图和 C++ 中进行创建。
生成器
生成器(Generator) 生成位置或 Actors(统称为 项目(Items))。它们将被测试和加权,最高加权的位置或 Actor 将被返回到行为树。
生成器可在蓝图和 C++ 中进行创建。
Contexts
Contexts 是诸多测试和生成器的参考框架。它们可能如 查询器 一样简单,也可能如 一种类型的所有 Actors 那样复杂。
需要注意的是生成器(如 Simple Grid 生成器)可使用返回多个位置或 Actors 的 Context。这将在每个 Context 的位置创建一个拥有特定尺寸和密度的简单网格。
Context 可在蓝图和 C++ 中进行创建。
测试
场景查询通过测试来确定生成器中的哪个项目为“最佳”。默认测试包含较大比例的使用情况,如项目是否能追踪至另一个位置,或项目和 context 之间的距离是否在特定范围之内。
当前版本中,测试 必须在 C++ 中进行创建,无法在蓝图中进行创建。
创建查询
在内容浏览器中 左键单击 Create 按钮
选择 Miscellaneous -> Environment Query
创建蓝图 Context
在内容浏览器中 左键单击 Create 按钮
选择 Blueprint
点开 All Classes
搜索 EnvQueryContext
选择 EnvQueryContext_BlueprintBase
创建蓝图生成器
在内容浏览器中 左键单击 Create 按钮
选择 Blueprint
点开 All Classes
搜索 EnvQueryGenerator
选择 EnvQueryGenerator_BlueprintBase
将 Root 和 Generator 连接起来
从 Root 节点下方的深色条 左键单击 并 拖动 至 Generator 节点上方的深色条构成连接。
此外,左键单击 并 拖动 进图表区中也可获得新建 Generator 节点的选项。
虽然可以在 Root 节点上连接多个 Generator 节点,但只有最左边的有效 Generator 才用于查询中。
为行为树添加一个查询
通过 Run EQS Query Task 节点即可在行为树中使用场景查询。
在行为树图表区中 单击右键。
创建一个 Task -> Run EQSQuery 节点。
选择新建的 Run EQSQuery 节点,将 Query Template 属性改为您的场景查询资源(或从下拉菜单中新建一个资源)。
可根据需求选择性地设置场景查询寻找的 Query Params。
最后,选择场景查询设置的黑板键,此处仅限使用对象和矢量黑板键。
编辑查询
添加生成器
在查询的图表区中单击右键,选择一个生成器。
添加测试
右键单击生成器并选择添加一个测试。
修改测试
在生成器上选择一个测试,并在 Details 面板中进行修改
参考 场景查询系统节点参考 部分的个体测试使用信息。
预览查询结果
在 场景查询系统测试 Pawn 文档中可查阅到如何预览查询结果。
编辑 Context
新建的 EnvQueryContext 蓝图拥有 4 个可应用函数:
Provide Single Location
Provide Single Actor
Provide Locations Set
Provide Actors Set
应用一个(或多个)函数可创建您的自定义 Context,以便在查询的测试中使用。右键单击需要应用的函数,选择 Implement Function。
提供单一位置
返回一个单一位置(矢量)。如何生成位置,则由您决定。例如此函数将返回查询器 1500 厘米内随机 Actor(DesiredObjectType 阵列中的类型,如 Pawn、载具等...)的追踪命中位置。
提供单一 Actor
返回一个单一 Actor。如何找到该 Actor,则由您决定。在此例中,函数将返回玩家 0 的受控(拥有的)Actor:
提供位置集
返回位置的阵列(矢量)。如何生成这些位置,则由您决定。此范例图表将从半径为 1500 个单位的圆上 16 个平均分布的位置进行追踪,返回成功的场景命中。
提供 Actors 集
返回 Actors 的阵列。如何找到这些 Actors,则由您决定。例如,此函数将返回 MyCharacter Actors 的一个阵列,其变量 Team Number 设为 1</code>:
编辑生成器
Event Do Item Generation
这是生成器的主要函数。应用此函数时将获得一个位置的阵列,这些位置是从场景查询传入的 Context 位置。这完全取决于 Context,它可能只是查询器位置条目的阵列,也可能是关卡中每个体力回复包的所在位置。
添加生成的 Actor
因为函数只能返回一个值,“Do Item Generation”函数实际拥有两个阵列,可巧妙地把它们传回到场景查询。此节点将添加一个 Actor 到 Actor 返回阵列,也可与 Add Generated Vector 节点共用,返回位置数值。
至于生成器如何定义实际被传回行为树的内容,则基于从 EnvQuery 节点设置的黑板键。
添加生成的矢量
因为函数只能返回一个值,“Do Item Generation”函数实际拥有两个阵列,可巧妙地把它们传回到场景查询。此节点将添加一个矢量到矢量返回阵列,也可与 Add Generated Actor 节点共用,返回 Actor 数值。
至于生成器如何定义实际被传回行为树的内容,则基于从 EnvQuery 节点设置的黑板键。
范例生成器
它从一个圆的边沿开始向查询器追踪,此圆的半径为 Rad。它基于 Number of Spokes 数值将追踪以一定角度分隔开来(为 360/Number of Spokes 数值)。追踪命中场景时才会保存其位置,本质上是寻找一个无法看到调用者的表面。
最终效果如下图:
此范例应该执行操作是 :使用从 Do Item Generation 传入的 Context Locations 对圆的生成位置进行修改。由于图像尺寸限制,此操作未能完成。
|
|