使用群集事件

介绍将事件发送到nDisplay群集及在蓝图中响应此类事件的方法。

Windows
MacOS
Linux

群集事件是使nDisplay群集中所有节点同时对事件响应的一种方法。

  1. 可在群集的节点中生成群集事件,也可从外部应用程序将其发送到主节点进行生成。参阅从蓝图发射群集事件从外部应用程序发射群集事件
    启动并运行nDisplay群集时,还可使用 nDisplay启动器 应用程序发送群集节点的新群集事件进行响应。参阅从nDisplay启动器发射群集事件

  2. 群集主节点收到群集事件时,其会将该事件传播到群集中的所有节点,以便在相同帧处的所有节点上发生该事件。

  3. 在虚幻引擎应用程序的蓝图或C++逻辑中,设置监听器检测此类群集事件并使用项目所需gameplay逻辑进行响应。参阅响应蓝图中的群集事件

群集事件结构

各nDisplay群集事件均可包含以下几个属性:

设置

类型

命名

字符串

类型

字符串

类别

字符串

参数

键值对的可选映射,其中的键和值均为字符串。

可在项目中决定发送到各属性中的数据,及监听器解译此类数据的方式。

与蓝图中的群集事件进行交互时,可使用 *Make DisplayClusterClusterEvent** 和 **Break DisplayClusterClusterEvent** 节点来构造和解构群集事件。例如:

A Cluster Event in Blueprint

在C++中,或者当您从自己的应用程序中发出群集事件时,您将使用JSON来表示相同的结构。例如,上述群集事件的等效JSON为:

{"Name":"activate","Type":"command","Category":"particles","Parameters":{"rate":"200","speed":"3"}}

从蓝图发射群集事件

要从项目中的蓝图类发出一个群集事件,请执行以下操作:

  1. 获得 DisplayCluster Module API(请参阅上文的蓝图API),并调用其 群集(Cluster) > (发射群集事件(接口函数)(Emits cluster event (接口调用)) 函数。该节点向主节点发射群集事件,其将该群集事件传播回群集中的所有节点。
    Emits cluster event

  2. 在gameplay逻辑中计算该蓝图节点的虚幻引擎应用程序各实例,会默认发射该群集事件。如在群集中的众多不同节点上计算该蓝图图表,则可能产生该事件的多个副本。
    为避免产生该群集事件的多个副本,可以在 Emits cluster event 节点上设置 仅主节点(Master Only) 布尔值。如勾选此项,仅主节点会发射该群集事件。如其他非主群集节点计算相同的蓝图图表,此类节点将不会发射事件。
    Master Only

  3. Emits cluster event 节点的 事件(Event) 端口向右拖出,并选择 Make DisplayClusterClusterEvent
    Make DisplayClusterClusterEvent

  4. 使用 Make DisplayClusterClusterEvent 节点中的设置来设置群集事件,为其 命名类型类别 设置字符串值。如需要随群集事件传递任意键值数据,可将此类键和值的映射传到 参数 输入。
    Creating and emitting a Cluster Event

  5. 编译保存 蓝图。

下次重新打包项目并重新启动nDisplay群集时,该蓝图代码将发射设置的群集事件。要在蓝图代码中其他位置响应该事件,参阅响应蓝图中的群集事件

从外部应用程序发射群集事件

启动nDisplay群集时,主节点开始聆听特定本地端口上传入的群集事件。通过连接该端口并发送消息,可在网络中其他计算机上运行的另一应用程序中,向nDisplay系统发射新的群集事件。

对于要发出的各群集节点,发送消息必须遵循以下条件:

  • 前两个字节必须给定消息剩余部分的总长度。

  • 消息的剩余部分应为群集事件的内容,以JSON对象表示。

例如,要发射命名为“quit”和类型为“command”的群集事件,需要进行以下操作:

  1. 构造包含群集节点值的JSON字符串。在本例中:

    {"Name":"quit","Type":"command","Category":"","Parameters":{}}

    命名类型类别 为必填字段,但可忽略参数字段。

  2. 获取JSON字符串的长度——在本例中为62个字符——并将该长度发送到nDisplay主节点。

  3. 将JSON字符串发送到nDisplay主节点。

如主节点能接收和处理消息,其将依照相同的条件向应用程序发送响应:

  • 前两个字节说明响应消息剩余部分的长度(以字节计)。

  • 消息剩余其余部分为JSON对象,通常包含一个字段:错误。该字段的值为错误代码,用于表明消息是否得到正确处理:

    代码

    含义

    0

    无错误。已成功处理消息。

    2

    发送的群集事件缺少一个或多个必填字段。确保其含有 命名类别类型 字段,即使此类字段的值为空。

    255

    发生未知错误。

主节点默认聆听端口14003上的群集事件。可在nDisplay配置文件中更改此默认设置。参阅更改nDisplay通信端口

要响应项目蓝图代码中的此类群集事件,参阅响应蓝图中的群集事件

从nDisplay启动器发射群集事件

nDisplay群集运行时,可随时使用 nDisplayLauncher 应用程序将群集事件发送到主节点。

  1. 如常启动nDisplay群集。

  2. 切换到 群集事件 选项卡。使用此选项卡设置群集事件并按需将其发送到群集。

  3. 点击 新建 向此选项卡上的列表添加新群集事件。
    Cluster events tab

  4. 使用 群集事件编辑器 窗口为该群集事件设置 命名类型类别 值。
    Settings in the Cluster event editor

  5. 还可向群集事件的列表或参数添加键值对。在 参数 字段中设置键,在 字段中设置值,然后点击 + 按钮。
    Parameters in the Cluster event editor

    如创建参数后需进行修改,在右侧列表中选中参数,然后点击 - 删除。然后使用所需设置重新新建参数。

  6. 点击 应用 以保存新群集事件。

  7. 回到 群集事件 选项卡,在列表中选择群集事件,然后点击 发送(Send)
    Send the Cluster Event

    还可点击 修改 以重新打开并编辑选中群集事件的值。

  8. 浏览nDisplayLauncher底部的日志输出面板,以查看来自主节点的响应。
    clusterevent-emit-launcher-response.png

要响应项目蓝图代码中的此类群集事件,参阅响应蓝图中的群集事件

响应蓝图中的群集事件

设置上述方法之一将群集事件发送到nDisplay网络后,需设置蓝图(或C++)gameplay逻辑来检测此类群集事件并以对其响应。为此,需要创建并注册监听器:实现 DisplayClusterClusterEventListener 接口的类。可通过在nDisplay API中调用 添加群集事件监听器(Add Cluster Event Listener) 函数注册监听器,然后使用 Event On Cluster Event 节点来检测并响应群集事件。

例如,要新建蓝图类并将其注册为监听器:

  1. 内容浏览器 中,右键点击并选择 创建基础资源(Create a Basic Asset)> 蓝图类(Blueprint Class)
    Create Blueprint Class

  2. Actor 选为父类。
    Actor

  3. 内容浏览器 中输入新监听器类的命名。
    Rename the class

  4. 将类拖入关卡视口,并将其拖放到关卡中。
    Drag and drop the Blueprint into the Level

  5. 双击新蓝图类可编辑。

  6. 在工具栏中,点击 类设置(Class Settings)
    Class Settings

  7. 细节 面板中,找到 接口(Interfaces)> 已实现接口(Implemented Interfaces) 设置,然后点击 添加
    Add interface

  8. 在列表中找到并选择 DisplayClusterClusterEventListener 接口。
    DisplayClusterClusterEventListener

  9. 点击工具栏中的 编译 以编译类。

  10. 事件图表(Event Graph) 选项卡上,设置以下图表以注册监听器:

    要进行此设置:

    1. Begin Play 事件节点直接向右拖出并选择 (N显示)N Display > (N显示)N Display > (获取DisplayCluster模块API)Get DisplayCluster Module API

    2. 从该节点的 Out API 端口直接向右拖出并选择 显示群集(Display Cluster) > 群集(Cluster) > (添加群集时间监听器(接口调用)(Add cluster event listener)

    3. 最后,从 Add cluster event listener 节点的 监听器 端口向左拖出,并选择 (变量)Variables > (获取自身引用)Get a reference to self

  11. 如不再需要监听器时,建议将其销毁。例如,销毁蓝图Actor时可如下操作:

    要进行这一设置,请执行以下操作:

    1. 右键点击事件图表并选择 添加事件(Add Event) > 事件销毁(Event Destroyed) 节点。

    2. Event Destroyed 节点的输出向右拖出,并选择 N显示(N Display) > 获取DisplayCluster模块API(Get DisplayCluster Module API)

    3. 从该节点的 输出API(Out API) 端口向右拖出,并选择 显示群集(Display Cluster)> 群集(Cluster)> 移除群集事件监听器(Remove cluster event listener)(接口调用)

    4. 最后,从 Remove cluster event listener 节点的 监听器(Listener) 端口向左拖出,并选择 变量(Variables)> 获取自身引用(Get a reference to self)

  12. 事件图表(Event Graph) 另一个区域,添加 Add Event > N Display > Event On Cluster Event 节点。在nDisplay群集中发生群集事件时,均会触发该事件。
    建议读取指定给该事件的设置和参数,以便用于确定蓝图需要采取的操作。为此,从事件 On Cluster Event 节点的 事件 端口向右拖出,并选择 中断DisplayClusterClusterEvent(Break DisplayClusterClusterEvent)
    例如,该图表会将所有群集事件的命名值直接输出到屏幕上:

  13. 编译保存 蓝图类。

下次在群集内,发射任何源中的群集事件时,将打印该群集事件命名到屏幕上。

Select Skin
Light
Dark

欢迎来到全新虚幻引擎4文档站!

我们正在努力开发新功能,包括反馈系统,以便您能对我们的工作作出评价。但它目前还未正式上线。如果您对此页面有任何意见与在使用中遭遇任何问题,请前往文档反馈论坛告知我们。

新系统上线运行后,我们会及时通知您的。

发表反馈意见