在蓝图中查找 Actor
本页介绍了有关如何使用 Get All Actors of Class 节点在关卡中查找 Actor 的示例。调用此节点将检索关卡中指定类的所有 Actor,并将其放置在数组(变量集合)中, 您可根据所需的筛选标准从该数组中抽取所有 Actor 或单个 Actor。然后,您可以访问 Actor 的属性或基于当前 Actor 的类型以及您要实现的目标采用某种方式对其进行修改。
Get All Actors of Class 节点
在此示例中,我们使用的是 带有起始资源的第三人称模板创建的项目中的蓝图 。
在 Game/Blueprints 下的 Content Browser 中,拖入三个 Blueprint_Effect_Fire 资源。
可随意放置,只是放置后将这些资源方便找到。
在 Game/Blueprints 文件夹下的 Content Browser 中,打开 MyCharacter 资源。
在 Blueprint Editor Window 的图表中,右键 并添加 F 按键事件。
按下 F 时,我们将尝试定位场景中的 Actor。
从 F 按键事件的 Pressed 针连出来,添加 Get All Actors Of Class 节点。
顾名思义,此操作将尝试获取指定类的所有 Actor。
在 Get All Actors of Class 节点中,单击 Actor Class 下拉菜单,然后添加 Blueprint_Effect_Fire 类。
拖开 Out Actors 并添加 ForEachLoop 节点。
Out Actors 是所有 Actor(指定类的 Actor)的 数组,我们可对其中“每个”Actor 执行操作。
拖开 ForEachLoop 节点的 Array Element,然后获取 P_Fire 和 Fire Audio。
在图表中 右键 并添加一个 Deactivate 节点,然后将火和音频针连接到 Target。
单击图像可查看全图。
在此,当玩家按下 F 时,我们将获取关卡中喷火效果的所有实例并将其停用。
单击 编译 按钮,关闭蓝图,然后单击 运行 在编辑器中开始游戏。
您可以通过按下 F 键停用放置在您关卡中的所有喷火实例。
使用此方法,我们可以查找特定类的所有 Actor 并以某种方式对其产生影响,但是,如果您想查找特定类的所有 Actor, 然后在该类中查找某组或特定 Actor(而非该类的所有 Actor)并进行修改,则应如何操作?下一节将向您介绍一些方法,您可以使用这些方法对结果数组过滤,并只获取所需的 Actor,而非所有 Actor。
Get Specific Actors 节点
在上一节中,我们了解到使用 Get All Actors of Class 节点可生成指定类的 Actor 数组。本节将介绍如何根据不同标准筛选阵列结果,以从阵列中获取特定 Actor 或单个 Actor。
方法之一是在 Actor 上使用 Tags,例如:
从上一节中的示例继续,在您的关卡中选择一种喷火效果。
在 Details 面板中,找到 Tags 部分并单击加号以向 Actor 添加标签。
在 0 字段中,为此标签输入一些文本,例如 Target。
在 MyCharacter 蓝图中,拖开 ForEachLoop 的 Array Element,然后添加 Get Tags 节点。
从 Tags 针连出来,添加 Get 节点。
此时,我们将“获得”标签,且索引为 0(上述步骤中将其设置为 Target)。
在图表中 右键 并添加 Branch 节点。
拖开 Branch 下的 Condition 并添加 Actor Has Tag 节点。
将 Get 节点的外针连接到 Actor Has Tag 节点上的 Tag 针。
将 ForEachLoop 针的 Array Element 连接到 Actor Has Tag 节点上的 Target 针。
拖开 ForEachLoop 针的 Array Element,以获取 P_Fire 和 Fire Audio 并将其连接到 Deactivate 节点。
单击图像可查看全图。
请注意,收集指定类的所有 Actor 并将其放置在阵列中后,我们应查看每个 Actor 以检查其是否具有指定标签,只有当 Actor 具有指定标签时,我们才可停用它。
以下是筛选结果的另一个示例:
单击图像可查看全图。
在以上示例中,我们获取了 Emitter 类的所有 Actor,而非特定的蓝图类,这可在您关卡中具有一些喷射器(如烟、火、风、雨和雾等)且您想全部关闭它们时使用。
我们将 Casting 到 Emitter 对象,然后检查该喷射器是否激活,若是,则停用它。
您不必始终 Cast 到 ForEachLoop 下的对象,请参阅以下示例:
单击图像可查看全图。
此时,我们将获取关卡中 TriggerBox 类的所有 Actor 并禁用在其上发生碰撞(关闭关卡中的所有触发器)。我们不必 Cast To TriggerBox, 因为我们要访问的是 TriggerBox Actor 本身而非 TriggerBox 的组件。当您想要访问构成 Actor 的组件时,则需使用 Cast To 节点。