Choose your operating system:
Windows
macOS
Linux
本页将向你展示如何设置和使用不同形式的 Replicated Functions。
远程调用函数主要包括 3 种类型: Multicast 广播、 Run on Server 在服务端执行 和 Run on owning Client 在客户端执行。广播函数在服务器上调用和执行,然后自动转发给客户端。 在服务端执行的函数由客户端调用,然后仅在服务器上执行。 在客户端执行的函数由服务器调用,然后仅在自有客户端上执行。
Multicast 广播
在此示例中,我们使用的是 带有初学者内容包的第三人称模板。
以下步骤说明了如何设置 Multicast 广播函数。
单击 Play 旁边的向下箭头并将 Number of Players 更改为 4 以增加玩家数量。
还可以在 Advanced Settings 选项中更改为多玩家生成的窗口的大小。
在**Content Browser 中, Content/ThirdPersonBP/Blueprints 下的打开 ThirdPersonCharacter** 蓝图。
在图表中 右键,并添加一个 Space Bar 按键事件和一个 Spawn Actor from Class 节点。
右键 并添加一个 Get Actor Transform 节点,然后与设置为 Blueprint_Effect_Fire 的 Class 连接,如下所示。
按下时,将在玩家角色位置生成喷火效果。
编译 并 保存,关闭蓝图,然后单击 运行 按钮在编辑器中开始游戏。
在游戏中,定位服务器所在的窗口,然后按 Space Bar 跳转。
你将会发现,只有服务器窗口才会生成喷火效果,其他玩家看不到生成的效果。 试图与其他玩家一起跳转时,他们都只能在本地生成喷火效果,彼此并不知道已经生成喷火效果。 此外,我们未将喷火效果附加给人物,所以只有在按 Space Bar 时,人物所在的位置才会喷火。
你可以按 Shift + F1 获取鼠标控制权,并在多人测试时在多个游戏窗口中跳转。
在 ThirdPersonCharacter 蓝图中,对于 Space Bar 节点 点击右键,然后断开连接。
右键 并搜索,然后添加 Custom Event 并调用 MulticastSpawn 事件。
单击自定义事件,然后在 Details 面板中将 Replicates 下拉菜单设置为 Multicast,并按如下所示连接。
最后几步之后就会出现上述设置自定义事件来使用 Multicast 复制函数的情况。
从 Space Bar 按键事件连出来,搜索并添加调用函数**MulticastSpawn**。
如果未找到创建的自定义事件,则单击 编译 按钮并再次搜索。
编译 并 保存,关闭蓝图,然后单击 运行 按钮在编辑器中开始游戏。
在游戏中,定位服务器所在的窗口,然后按 Space Bar 跳转。
你现在应该可以看到,当你与服务器上的玩家一起按跳转时,服务器和所有客户端上都将生成喷火效果。试图与其他玩家一起跳转仍只能在本地喷火,因为我们并未告知服务器客户端已生成该效果。接下来的 Run on Server 部分将向你展示如何将其设置。
Run On Server (在服务器上运行)
在此示例中,我们继续以上 Multicast Replication 示例。
以下步骤展示了如何设置 Run on Server 复制函数。
在 Content/ThirdPersonBP/Blueprints 下的 Content Browser 中,打开 ThirdPersonCharacter 蓝图。
选择 MulticastSpawn 自定义事件,然后将 Replicates 下拉选项更改为 Run on Server。
为了保持一致,我们还将 Graph Node 的名称更新为了 Run On Server。
编译 并 保存,关闭蓝图,然后单击 运行 按钮在编辑器中开始游戏。
在游戏中,定位非服务器的任何游戏窗口,然后按 Space Bar 跳转。
注意,喷火效果只在服务器上生成,无论哪个玩家跳转,其他玩家都看不到,只有服务器端才能看到。尽管我们说过该脚本应在服务器上执行,而事实也是如此,但我们需确保该效果已设置为复制,以便其传递给所有客户端和服务器。
在 Content/StarterContent/Blueprints 文件夹中,打开 Blueprint_Effect_Fire 蓝图。
从主工具栏中选择 Class Defaults 后,在 Details 面板中,选中 Replicates 复选框。
编译 并 保存,关闭蓝图,然后单击 运行 按钮在编辑器中开始游戏。
在游戏中,定位非服务器的任何游戏窗口,然后按 Space Bar 跳转。
我们已经向服务器发送消息,以在服务器运行部分脚本来生成 Actor,由于此 Actor 已设置为复制,因此我们可以在所有客户端上看到它。
Run On Owning Client (在所有权的客户端上运行)
在此示例中,我们继续以上 Multicast Replication 示例。
在此示例中,我们要做到是创建一个发生服务器事件时仅在特定客户端上更新的变量。
以下步骤展示了如何设置 Run on owning Client 复制函数。
在 Content/ThirdPersonBP/Blueprints 文件夹中,打开 ThirdPersonCharacter 蓝图。
在 MyBlueprint 窗口中,创建新变量并将其命名为 Inventory,然后单击 Compile。
在此变量的 Details 面板中,将其设置为 String、Editable 和 Replicated,然后为 Default Value 输入 Empty。
将此变量设置为 Replicated 可确保其通过网络复制到所连接的机器上。我们将使用此变量模拟人物在多人游戏中进入触发卷时收集道具,退出触发卷时删除道具。
添加一个与 Print String 连接的 P 按键事件,然后按住 Control 并拖入 Inventory 变量,并按所示方式连接。
Compile 并 Save,然后关闭 ThirdPersonCharacter 蓝图。
在 放置Actor(Place Actors) 的 基础(Basic) 选项卡中,将 盒体触发器(Box Trigger) 拖入你的关卡。
当玩家人物进入触发器时,我们将更新创建的变量,但仅在进入触发器盒的客户端上更新。
在 Rendering 下 Box Trigger 的 Details 面板中,取消选中 Actor Hidden In Game。
在编辑器中玩游戏时,这可让我们在关卡中看到此盒,使得测试更加轻松。
单击 Box Trigger 将其选中,然后从主工具栏打开**Level Blueprint**。
在图表中 右键 ,然后搜索 Begin Overlap 并选择 Add On Actor Begin Overlap 事件。
重复上一步,但搜索并添加 Add On Actor End Overlap 事件。
将每个节点连接到 Switch Has Authority 节点。
Switch Has Authority 节点用于检查当前正在运行的脚本正在从何处执行,然后基于脚本是在网络授权者(通常为服务器)还是远程机器(客户端)上运行将其分成两个不同的方向。
通常,你会对只希望在服务器上发生的事情使用授权者(这些通常为游戏关键性事件,例如调整玩家的生命值或赠送奖励或掠夺物品,因为你不想让客户端确定这些更改何时发生,以防作弊)。
在此示例中,我们将更新文本变量,此变量也完全可以是包含玩家生命值的变量,或所收集道具的变量。
在图表中 右键 并添加一个称作 Add Item 的 Custom Event 节点。
将 Replicates 选项设置为 Run on owning Client,并添加称作 Character 的输入,将其设置为 Actor。
创建节点后,如果你看到错误警告,请单击 Compile 按钮删除错误。
创建另一个称作 Remove Item 的 Custom Event,其设置与 Add Item 事件的设置相同。
如下所示,从两个重叠事件连出来,接 Add Item 和 Remove Item 节点。
这里我们指的是,当重叠触发器时,如果重叠发生在服务器上,在服务器上运行 Add Item 事件,并将它复制到自有客户端(即重叠触发器的人物所在的客户端)。"它"是指 Add Item 启动并仅在服务器上执行但复制到客户端时所调用的脚本。当人物退出触发器盒时 — 这也由服务器决定,在服务器上运行 Remove Item 事件,并将其复制到自有客户端。
从 Add Item 事件连出来,添加 Print String (文本设置为 Item Added ),然后拖开 Character 和 Cast To ThirdPersonCharacter。
从 As Third Person Character 针连出来,搜索并添加 Set Inventory 节点,将文本设置为 Has the Item。
此处,我们选取的是在服务器上执行并复制到客户端的事件,此事件将在屏幕上显示"item added",然后将自有客户端的 Inventory 文本变量设置为"Has the item"。
在 Add Item 事件之后复制三个节点,并将其连接到 Remove Item 事件。
将 Print String 更改为 Item Removed,将 Inventory 文本变量更改为 Empty。
现在,当人物退出触发器时,文本变量将在服务器上更新并复制到自有客户端。
编译 并 保存,然后关闭 Level Blueprint 并在编辑器中开始游戏。
在以上视频中,当游戏启动时,按 P 可将文本变量打印到屏幕上,可对每个角色显示 "empty"。但是,当其中一个角色退出触发器盒时,将显示文本 "item added"。当人物按 P 时,文本将更改为 "has the item",但其他人物仍显示 "empty"。当人物退出触发器盒时,将显示文本 "item removed",再次按 P 时,文本将更改回 "empty"。
此示例说明了如何在服务器上运行事件并将这些事件复制到单个客户端。