在蓝图中同步 Actor

本页面的内容:

本页介绍了如何使用 Actor 上的 Replicates 选项,以使其在服务器和客户端机器上显示(或不显示)。 在列举的两个示例中,同步 Actors 示例介绍了如何将 Actor 设置为同步以及同步和非同步的 Actor 之间的区别。 第二个示例说明了如何通过使用 Switch Has Authority 节点(此节点检查当前正在运行蓝图脚本的是服务器还是客户端)动态生成和控制 Actor 的显示位置。

同步 Actor

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

以下步骤说明了如何将 Actor 设置为 Replicate,以及 Replicate 的 Actor 和非 Replicate 的 Actor 之间的区别。

  1. Game/StarterContent/Blueprints 文件夹中,右键 Blueprint_Effect_Fire 并选择 Duplicate

    HowTo1.png

  2. 重复上述步骤以再创建一个蓝图的复制副本。

  3. 重命名副本,一个为 Fire_NoReplicate,另一个为 Fire_Replicate

    HowTo2.png

  4. 打开 Fire_NoReplicate 蓝图并单击 classDefaults_button.png 按钮,然后在 Details 面板中,取消选中 Net Load on Client

    HowTo3.png

    取消选中此选项后,加载地图时,这个 Actor 将不会在客户端上自动加载。由于 Replicates 也未勾选,所以就算它应该被创建出来的时候,这个 Actor 也不会在客户端上显示。

  5. 编译保存,然后关闭此蓝图并打开 Fire_Replicate 蓝图。

  6. 单击 classDefaults_button.png 按钮以在 Details 面板中打开蓝图默认设置,然后选中 Replicates 复选框。

    HowTo4.png

    选中 Replicates 即表示可在客户端上同步此 Actor。由于也选中了 Net Load on Client,所以地图加载时,Actor 将自动加载并在客户端机器上显示。Replicates 的用处是, 如果您想在游戏期间某个时刻而非地图加载时生成 Actor,您将需要启用 Replicates 以指示当生成 Actor 时,继续操作并在客户端机器上生成复制副本。

  7. 编译保存,然后关闭蓝图。

  8. 内容浏览器 中,将 Fire_NoReplicate 蓝图拖放到您的关卡。

    HowTo5.png

  9. 内容浏览器 中,将 Fire_Replicate 蓝图拖放到您的关卡。

    HowTo6.png

  10. 单击 Play 按钮旁的下箭头,并将 Number of Players 选项更改为 2

    HowTo8.png

  11. 单击 Play 按钮在编辑器中开始游戏。

    HowTo9.png

    当您在编辑器中开始游戏且打开新的客户端窗口时,您应注意到 Fire_NoReplicate 蓝图在服务器上显示,而未在客户端上显示。然而,如上所示,Fire_Replicate 蓝图同时显示在客户端和服务器上。

动态创建同步的 Actor

在此示例中,我们将继续以上 Replicating Actors 示例。

以下步骤说明了如何在游戏过程中使用 Replication 在服务器/客户端上动态生成 Actor。

  1. 在关卡视图中,从关卡中删除 Fire_ReplicateFire_NoReplicate Actor。

  2. All Classess 下的 Modes 菜单中,将两个 Target Points 拖入您的关卡。

    Switch1.png

  3. 将一个 Target Point 重命名为 No_Replicate,另一个重命名为 Replicate,然后在 World Outliner 中同时选择两者。

    Switch2.png

  4. 从主工具栏的 Blueprints 菜单中打开 Level Blueprint

    GHT1_1.png

  5. Level Blueprint 中,在图表中 右键 并选择 Create References to 2 selected Actors 选项。

    Switch4.png

  6. 再次在图表中 右键,然后搜索和添加 Event Begin Play 节点。

    Switch5.png

    虽然这里用了 Event Begin Play 节点在游戏开始时创建 Actor,但您可以将这个节点换成在您希望的游戏期间的其他节点创建 Actor。 这些节点可以是按键的响应事件节点,也可以是其他动态事件节点,用它们都能创建 Actor。

  7. 在图表中 右键 并搜索和添加 Spawn Actor from Class 节点,然后将 Class 设置为 Fire_Replicate

  8. 重复上述步骤以再创建一个 Spawn Actor from Class 节点并将类设置为 Fire_NoReplicate

  9. 如下所示,连接节点。

    Switch6.png

  10. 拖开蓝色 Replicate 节点并搜索和添加 Get Actor Transform 节点。

  11. Get Actor Transform 节点连接到 Spawn Actor from Class 节点的 Spawn Transform 针。

  12. 重复蓝色 No_Replicate 节点上述两个步骤(结果应类似于如下所示)。

    Switch7.png

    然后,我们将添加 Switch Has Authority(或 Authority Guard)节点以确定由 Authority(服务器)还是 Remote 机器(客户端)执行该脚本。通常,此选项将设置为 Authority,以确保只有服务器可以执行游戏性关键脚本,如调整玩家生命值或分配分数、经验等,因为您不希望让客户端通过执行此类脚本来作弊。

  13. 拖开 Event Begin Play 节点并添加 Switch Has Authority 节点。

    Switch9.png

    Authority 应被自动设为默认设置并连接到第一个 Spawn Actor from Class 节点。

  14. 编译,然后关闭 Level Blueprint 并在编辑器中开始游戏。

    Switch10.png

    您应该会看到,由于只有服务器执行了脚本,两种喷火效果都显示在服务器上,而只有设置为同步的喷火效果显示在客户端上。 当您想在服务器或客户端(而非两者)上生成某物时,或更重要的是,在服务器或客户端上执行 Switch Has Authority 节点下的任何脚本时(如上所述),此操作非常有用。

  15. 返回 Level Blueprint 并拖开 Remote 针,然后如下所示连接此针。

    Switch11.png

  16. 编译,然后关闭 Level Blueprint 并在编辑器中开始游戏。

    Switch12.png

    您现在应该可以看到,由于 Switch Has Authority 设置为 Remote,所以其下的脚本仅在客户端而非服务器上执行。 例如,您拥有玩家受到伤害时可应用的某种屏幕特效,通过将 Remote 用作 Authority Guard,您可以用这种方式只在执行脚本的远程客户端上生成该特效。