蓝图通信用法

使用蓝图时,如需在蓝图之间传递或共享信息,需要使用一种形式的 蓝图通信。可根据需求使用数种不同类型的通信。此页面讲述最常用的方法并提供帮助链接和使用情况范例。

直接蓝图通信

2_9.png

Direct Blueprint Communication is the most common method of Blueprint Communication and is great for when you have two Blueprints that you know you want to have talk to each other at some point. This type of communication is always one-to-one; meaning one Blueprint (the "Working Blueprint") is requesting to access another Blueprint (the "Target Blueprint"). The simplest way to use Direct Blueprint Communication is to get a reference to the Target Blueprint through a publicly exposed object Variable and then specify which instance of that Blueprint you want to access.

可在 管理蓝图通信 中查阅详细内容。

何时使用

以下范例讲述何时使用 直接蓝图通信

  • 关卡中存在两个 Actors,需要进行相互之间的通信。

    • 与关卡中的一个开关进行互动后打开特定的门或开启特定的灯(每个均为单独的蓝图)。

设置直接蓝图交流 中可查阅设置流程。

事件分配器

OpenDoorEventDispatch.png

事件分配器 适用于告知其他“正在倾听的”蓝图已发生事件。事件发生时,正在倾听的蓝图便会作出反应,并相互独立地执行预期的操作。

例如,游戏中有一个 Boss,它被消灭时将会调用“OnDied”事件分配器。可将“OnDied”事件 绑定 在任意数量的其他蓝图中,如角色(作出庆祝动作)、关卡中的门(会打开)或 HUD(显示 UI 信息)。所有这些蓝图均在收到 Boss 被消灭的“OnDied”通知后执行。

可在 事件调度器 中查阅详细内容。

何时使用

事件分配器 使用时机的例子:

  • 需要从角色蓝图到关卡蓝图进行通信。

    • 玩家角色升级,需要开放之前锁定的区域。

    • 玩家角色按下行动按钮,对关卡执行某种操作。

  • 生成的 Actor 执行某种操作时触发事件。

    • 生成一个 Boss,Boss 被消灭时触发事件,在世界场景中生成一个奖励。

    • 在关卡中生成一个道具(武器、回复剂等)并在道具被拾起时告知道具和角色。

设置事件分配器 中可查阅设置流程。

蓝图接口

InterfaceNodes.png

通过 蓝图接口(简称 接口)可实现与多种类型对象(均共享特定功能)形成互动的一般方法。例如汽车和树是完全不同的两种对象,但拥有一个共同点 - 它们均可被武器开火击中并遭到破坏。

创建一个包含 OnTakeWeaponFire 函数的蓝图接口,让汽车和树应用此蓝图接口后即可将二者视为相同的对象;在任意一个对象被击中时调用 OnTakeWeaponFire 函数,并使它们出现不同反应。

理解蓝图接口的最佳方式是将其视为一种合约。合约的内容为:“如应用此接口,则须承诺应用这些特定的函数,并在调用时形成反应。” 多个蓝图可应用一个接口,但并非所有蓝图均会形成反应(部分蓝图将无视调用)。回到之前武器开火的例子中,墙壁不需要对破坏作出反应,因此它们不会应用带 OnTakeWeaponFire 函数的接口,并无视调用。

可在 实现蓝图接口 中查阅详细内容。

何时使用

在以下情况实例中,蓝图接口 非常适合于通信:

  • 数个蓝图中存在一些相似功能,但在调用后执行不同的效果。

    • 玩家拥有一个火焰喷射器,使用时将触发一个名为 ElementalDamage 的事件。树木蓝图接受 ElementalDamage 调用并将树木烧毁,而雪人蓝图将把雪人融化。

    • 玩家拥有一个“use”按钮,按下按钮可执行开门、关灯、拾起道具等操作。

    • 敌人拥有特殊能力,可基于玩家的体力值完成变化,执行不同操作。

设置蓝图接口 中可查阅设置流程。

蓝图投射

Event6.png

蓝图通信的另一种常见形式是使用 Cast 节点。使用 Cast 节点时,便是在询问对象“你是否为该对象的特殊版本”。如果是,则进行访问;如否,则忽略请求。

例如,您创建了一个名为“Flying Character 蓝图”的特殊角色蓝图,此蓝图可使玩家角色在游戏中飞行。您可使用 Get Player Character 节点访问玩家角色的移动组件并在通过常规方法对玩家产生影响,如设置其位置、旋转等。您无法获得飞行能力,因为 Character 蓝图并不了解飞行。只有“Flying Character 蓝图”了解飞行。在此例中,您需要获取玩家角色和 Cast To Flying 蓝图,之后才可访问 flying 函数。

如玩家角色未使用 Flying Character 蓝图而完全使用不同类型的 Character 蓝图,则执行 Cast To Flying 蓝图时会失败,因为并未使用 Flying 蓝图,所以无法访问并执行飞行命令。

可在 投射 中查阅详细内容。

何时使用

以下是 蓝图投射 使用时机的几个例子:

  • 需要访问另一个蓝图的特殊版本。

    • 角色走进火焰中,导致体力值耗尽。

      • 投射到特殊的角色蓝图,以便访问并变更体力值。

    • 角色死亡,需要重新生成。

      • 投射到特殊的游戏模式蓝图,执行重新生成脚本。

  • 需要访问相同类的多个蓝图,并以相同方法进行修改。

    • 场景中拥有数盏灯,事件发生时需将它们开启或关闭。

      • 投射到灯蓝图并执行函数将灯关闭。

  • 需要访问一个特殊的子蓝图。

    • 存在基于一个动物蓝图(猫、狗、鸟)的数个蓝图,需要访问其中一个动物。

      • 投射到猫、狗和鸟,访问其相应的蓝图和特有功能。

设置蓝图投射 中可查阅设置流程。