Choose your operating system:
Windows
macOS
Linux
本页介绍了如何使用 Actor 上的 Replicates 选项,以使其在服务器和客户端机器上显示(或不显示)。在列举的两个示例中,同步 Actors 示例介绍了如何将 Actor 设置为同步以及同步和非同步的 Actor 之间的区别。第二个示例说明了如何通过使用 Switch Has Authority 节点(此节点检查当前正在运行蓝图脚本的是服务器还是客户端)动态生成和控制 Actor 的显示位置。
同步 Actor
在此示例中,我们使用的是带有 初学者内容包 的 第三人称模板 蓝图项目。
以下步骤说明了如何将 Actor 设置为 Replicate,以及 Replicate 的 Actor 和非 Replicate 的 Actor 之间的区别。
在 Game/StarterContent/Blueprints 文件夹中,右键点击 Blueprint_Effect_Fire 并选择 Duplicate。
重复上述步骤以再创建一个蓝图的复制副本。
重命名副本,一个为 Fire_NoReplicate,另一个为 Fire_Replicate。
打开 Fire_NoReplicate 蓝图并单击 按钮,然后在 Details 面板中,取消选中 Net Load on Client。
取消选中此选项后,加载地图时,这个 Actor 将不会在客户端上自动加载。由于 Replicates 也未勾选,所以就算它应该被创建出来的时候,这个 Actor 也不会在客户端上显示。
编译 并 保存,然后关闭此蓝图并打开 Fire_Replicate 蓝图。
单击 按钮以在 Details 面板中打开蓝图默认设置,然后选中 Replicates 复选框。
选中 Replicates 即表示可在客户端上同步此 Actor。由于也选中了 Net Load on Client,所以地图加载时,Actor 将自动加载并在客户端机器上显示。Replicates 的用处是,如果你想在游戏期间某个时刻而非地图加载时生成 Actor,你将需要启用 Replicates 以指示当生成 Actor 时,继续操作并在客户端机器上生成复制副本。
编译 并 保存,然后关闭蓝图。
从 内容浏览器 中,将 Fire_NoReplicate 蓝图拖放到你的关卡。
从 内容浏览器 中,将 Fire_Replicate 蓝图拖放到你的关卡。
单击 Play 按钮旁的下箭头,并将 Number of Players 选项更改为 2。
单击 Play 按钮在编辑器中开始游戏。
当你在编辑器中开始游戏且打开新的客户端窗口时,你应注意到 Fire_NoReplicate 蓝图在服务器上显示,而未在客户端上显示。然而,如上所示,Fire_Replicate 蓝图同时显示在客户端和服务器上。
动态创建同步的 Actor
在此示例中,我们将继续以上 Replicating Actors 示例。
以下步骤说明了如何在游戏过程中使用 Replication 在服务器/客户端上动态生成 Actor。
在关卡视图中,从关卡中删除 Fire_Replicate 和 Fire_NoReplicate Actor。
在 放置Actor(Place Actors) 面板的 所有类(All Classess) 选项卡中,将两个 Target Points 拖入你的关卡。
将一个 Target Point 重命名为 No_Replicate,另一个重命名为 Replicate,然后在 World Outliner 中同时选择两者。
从主工具栏的 Blueprints 菜单中打开 Level Blueprint。
在 Level Blueprint 中,在图表中 右键 并选择 Create References to 2 selected Actors 选项。
再次在图表中 右键,然后搜索和添加 Event Begin Play 节点。
虽然这里用了 Event Begin Play 节点在游戏开始时创建 Actor,但你可以将这个节点换成在你希望的游戏期间的其他节点创建 Actor。这些节点可以是按键的响应事件节点,也可以是其他动态事件节点,用它们都能创建 Actor。
在图表中 右键 并搜索和添加 Spawn Actor from Class 节点,然后将 Class 设置为 Fire_Replicate。
重复上述步骤以再创建一个 Spawn Actor from Class 节点并将类设置为 Fire_NoReplicate。
如下所示,连接节点。
拖开蓝色 Replicate 节点并搜索和添加 Get Actor Transform 节点。
将 Get Actor Transform 节点连接到 Spawn Actor from Class 节点的 Spawn Transform 针。
重复蓝色 No_Replicate 节点上述两个步骤(结果应类似于如下所示)。
然后,我们将添加 Switch Has Authority(或 Authority Guard)节点以确定由 Authority(服务器)还是 Remote 机器(客户端)执行该脚本。通常,此选项将设置为 Authority,以确保只有服务器可以执行游戏性关键脚本,如调整玩家生命值或分配分数、经验等,因为你不希望让客户端通过执行此类脚本来作弊。
拖开 Event Begin Play 节点并添加 Switch Has Authority 节点。
Authority 应被自动设为默认设置并连接到第一个 Spawn Actor from Class 节点。
编译,然后关闭 Level Blueprint 并在编辑器中开始游戏。
你应该会看到,由于只有服务器执行了脚本,两种喷火效果都显示在服务器上,而只有设置为同步的喷火效果显示在客户端上。当你想在服务器或客户端(而非两者)上生成某物时,或更重要的是,在服务器或客户端上执行 Switch Has Authority 节点下的任何脚本时(如上所述),此操作非常有用。
返回 Level Blueprint 并拖开 Remote 针,然后如下所示连接此针。
编译,然后关闭 Level Blueprint 并在编辑器中开始游戏。
你现在应该可以看到,由于 Switch Has Authority 设置为 Remote,所以其下的脚本仅在客户端而非服务器上执行。例如,你拥有玩家受到伤害时可应用的某种屏幕特效,通过将 Remote 用作 Authority Guard,你可以用这种方式只在执行脚本的远程客户端上生成该特效。