蓝图中查找 Actor

本页介绍了有关如何使用 Get All Actors of Class 节点在关卡中查找 Actor 的示例。调用此节点将检索关卡中指定类的所有 Actor,并将其放置在数组(变量集合)中, 您可根据所需的筛选标准从该数组中抽取所有 Actor 或单个 Actor。然后,您可以访问 Actor 的属性或基于当前 Actor 的类型以及您要实现的目标采用某种方式对其进行修改。

Get All Actors of Class 节点

在此示例中,我们使用的是 带有起始资源的第三人称模板创建的项目中的蓝图

  1. Game/Blueprints 下的 Content Browser 中,拖入三个 Blueprint_Effect_Fire 资源。

    Actors1.png

    可随意放置,只是放置后将这些资源方便找到。

  2. Game/Blueprints 文件夹下的 Content Browser 中,打开 MyCharacter 资源。

  3. Blueprint Editor Window 的图表中,右键 并添加 F 按键事件。

    Actors2.png

    按下 F 时,我们将尝试定位场景中的 Actor。

  4. F 按键事件的 Pressed 针连出来,添加 Get All Actors Of Class 节点。

    Actors3.png

    顾名思义,此操作将尝试获取指定类的所有 Actor。

  5. Get All Actors of Class 节点中,单击 Actor Class 下拉菜单,然后添加 Blueprint_Effect_Fire 类。

    Actors4.png

  6. 拖开 Out Actors 并添加 ForEachLoop 节点。

    Actors5.png

    Out Actors 是所有 Actor(指定类的 Actor)的 数组,我们可对其中“每个”Actor 执行操作。

  7. 拖开 ForEachLoop 节点的 Array Element,然后获取 P_FireFire Audio

  8. 在图表中 右键 并添加一个 Deactivate 节点,然后将火和音频针连接到 Target

    单击图像可查看全图。

    在此,当玩家按下 F 时,我们将获取关卡中喷火效果的所有实例并将其停用。

  9. 单击 编译 按钮,关闭蓝图,然后单击 运行 在编辑器中开始游戏。

您可以通过按下 F 键停用放置在您关卡中的所有喷火实例。

使用此方法,我们可以查找特定类的所有 Actor 并以某种方式对其产生影响,但是,如果您想查找特定类的所有 Actor, 然后在该类中查找某组或特定 Actor(而非该类的所有 Actor)并进行修改,则应如何操作?下一节将向您介绍一些方法,您可以使用这些方法对结果数组过滤,并只获取所需的 Actor,而非所有 Actor。

Get Specific Actors 节点

在上一节中,我们了解到使用 Get All Actors of Class 节点可生成指定类的 Actor 数组。本节将介绍如何根据不同标准筛选阵列结果,以从阵列中获取特定 Actor 或单个 Actor。

方法之一是在 Actor 上使用 Tags,例如:

  1. 从上一节中的示例继续,在您的关卡中选择一种喷火效果。

  2. Details 面板中,找到 Tags 部分并单击加号以向 Actor 添加标签。

    Actors8.png

  3. 0 字段中,为此标签输入一些文本,例如 Target

    Actors9.png

  4. MyCharacter 蓝图中,拖开 ForEachLoopArray Element,然后添加 Get Tags 节点。

    Actors10.png

  5. Tags 针连出来,添加 Get 节点。

    Actors11.png

    此时,我们将“获得”标签,且索引为 0(上述步骤中将其设置为 Target)。

  6. 在图表中 右键 并添加 Branch 节点。

  7. 拖开 Branch 下的 Condition 并添加 Actor Has Tag 节点。

  8. Get 节点的外针连接到 Actor Has Tag 节点上的 Tag 针。

  9. ForEachLoop 针的 Array Element 连接到 Actor Has Tag 节点上的 Target 针。

    Actors12.png

  10. 拖开 ForEachLoop 针的 Array Element,以获取 P_FireFire Audio 并将其连接到 Deactivate 节点。

    单击图像可查看全图。

    请注意,收集指定类的所有 Actor 并将其放置在阵列中后,我们应查看每个 Actor 以检查其是否具有指定标签,只有当 Actor 具有指定标签时,我们才可停用它。

以下是筛选结果的另一个示例:

单击图像可查看全图。

在以上示例中,我们获取了 Emitter 类的所有 Actor,而非特定的蓝图类,这可在您关卡中具有一些喷射器(如烟、火、风、雨和雾等)且您想全部关闭它们时使用。 我们将 CastingEmitter 对象,然后检查该喷射器是否激活,若是,则停用它。

您不必始终 CastForEachLoop 下的对象,请参阅以下示例:

单击图像可查看全图。

此时,我们将获取关卡中 TriggerBox 类的所有 Actor 并禁用在其上发生碰撞(关闭关卡中的所有触发器)。我们不必 Cast To TriggerBox, 因为我们要访问的是 TriggerBox Actor 本身而非 TriggerBox 的组件。当您想要访问构成 Actor 的组件时,则需使用 Cast To 节点。