场景查询系统用户指南

描述了创建和使用EQS资源的常见方法。

Windows
MacOS
Linux

本页面讲述了启用、创建和编辑场景查询系统(EQS)资源的常规工作流程。 

启用EQS

在使用EQS之前,需要从 编辑器首选项(Editor Preferences) 菜单将其启用。

  • 在 编辑器首选项(Editor Preferences)> 试验性(Experimental)> AI 部分,启用 场景查询系统(Environmental Query System) 选项。

    EQSUG_EnableEQS.png

创建EQS查询

创建EQS资源的方法: 

  1. 内容浏览器 中单击 新增(Add New) 按钮,然后在 AI(Artificial Intelligence) 下面选择 场景查询(Environment Query)。 

    EQSUG_CreateEQSAsset.png

  1. 输入新EQS资源的名称。 

    EQSUG_EnterEQSName.png

除场景查询外,还可以在内容浏览器中创建自定义生成器情境 蓝图资源。

编辑EQS查询

在EQS资源中,可以使用生成器 来生成将要测试和加权的位置或Actor,提供情境 或参考框架,并进行测试 来决定生成器产生的哪个项目(Item)是最佳选择。下节将说明如何在EQS资源中创建它们。

添加生成器的方法:

  • 在EQS图表中右键单击,然后选择需要的生成器类型。

    EQSUG_AddGenerator.png

    添加生成器之后,拖出Root节点,把它连接到你的生成器。 

    EQSUG_ConnectGenerator.png

    虽然可以将多个生成器连接到Root,但查询中只会使用最左侧的生成器。

添加测试的方法:

  • 右键单击生成器,并选择要添加的测试。 

    EQSUG_AddTest.png

    添加测试后,它将出现并连接到生成器。选择测试,在 细节(Details) 面板中调节其属性。 

    EQSUG_AddTestDetails.png

定义情境的方法:

  • 在测试的 细节(Details) 面板中,将 EnvQueryContext 更改为需要的情境。 

    EQSUG_Context.png

    属性名称可能根据测试类型而变化。请参见测试 了解更多信息。

预览EQS查询

可以在编辑器中预览EQS查询的结果,会以调试球体显示加权/过滤后的结果。 

EQSUG_Preview.png

在上图中,我们调试了一个EQS查询,它返回了能看到关卡中角色的一个位置。 

欲知更多信息,请参见AI调试EQS测试Pawn

将EQS用于行为树

创建EQS查询后,可以在行为树 中将查询作为 任务 的一部分来运行。

  1. 在行为树中右键单击并添加 运行EQS查询(Run EQS Query) 任务节点。

    EQSUG_RunEQS.png

  2. 针对 运行EQS查询(Run EQS Query),分配要执行的 查询模板(Query Template)(所需的EQS资源)和它应该返回的 黑板键(Blackboard Key)

    EQSUG_EditEQSBT.png

    返回的黑板键是权重最高的结果(对象或矢量)。在上面的示例中,我们有一个EQS查询用于定位玩家,并将该位置重新提供给一个黑板键,其名为 MoveToLocation。 

    可以通过 查询配置(Query Config) 选项选择性地添加要传递到EQS测试的参数。

结合原生代码使用EQS

虽然EQS查询通常是在行为树中运行,但也可以直接从原生代码使用它。以下示例展示了一个虚构的查询,要在指定区域内为角色或物品寻找安全生成地点:

// 以下名称必须与查询中使用的变量名一致
static const FName SafeZoneIndexName = FName(TEXT("SafeZoneIndex"));
static const FName SafeZoneRadiusName = FName(TEXT("SafeZoneRadius"));

// 运行查询,根据区域索引和安全半径寻找安全的生成点
bool AMyActor::RunPlacementQuery(const UEnvQuery* PlacementQuery)
{
    if (PlacementQuery)
    {
        // 设置查询请求
        FEnvQueryRequest QueryRequest(PlacementQuery, this);

        // 设置查询参数
        QueryRequest.SetIntParam(SafeZoneIndexName, SafeZoneIndexValue);
        QueryRequest.SetFloatParam(SafeZoneRadiusName, SafeZoneRadius);

        // 执行查询
        QueryRequest.Execute(EEnvQueryRunMode::RandomBest25Pct, this, &AFortAthenaMutator_SpawningPolicyBase::OnEQSSpawnLocationFinished);

        // 返回true说明查询已开始
        return true;
    }

    // 返回false说明查询未能开始
    return false;
}
Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback