Actor 的复制
4.4 在蓝图中同步变量
介绍了如何使用 Actor 上的 Replicates 选项,以使其在服务器和客户端机器上显示(或不显示)。在列举的两个示例中,同步 Actors 示例介绍了如何将 Actor 设置为同步以及同步和非同步的 Actor 之间的区别。第二个示例说明了如何通过使用 Switch Has Authority 节点(此节点检查当前正在运行蓝图脚本的是服务器还是客户端)动态生成和控制 Actor 的显示位置。
4.4.1 同步 Actor
在此示例中,我们使用的是带有 初学者内容包 的 第三人称模板 蓝图项目。
取消选中此选项后,加载地图时,这个 Actor 将不会在客户端上自动加载。由于 Replicates 也未勾选,所以就算它应该被创建出来的时候,这个 Actor 也不会在客户端上显示。
步骤说明了如何将 Actor 设置为 Replicate,以及 Replicate 的 Actor 和非 Replicate 的 Actor 之间的区别。
选中 Replicates 即表示可在客户端上同步此 Actor。**由于也选中了 Net Load on Client,所以地图加载时,Actor 将自动加载并在客户端机器上显示。Replicates 的用处是,如果你想在游戏期间某个时刻而非地图加载时生成 Actor,你将需要启用 Replicates 以指示当生成 Actor 时,继续操作并在客户端机器上生成复制副本。
当你在编辑器中开始游戏且打开新的客户端窗口时,你应注意到 Fire_NoReplicate 蓝图在服务器上显示,而未在客户端上显示。然而,如上所示,Fire_Replicate 蓝图同时显示在客户端和服务器上。 (服务器和客户端的运行)
4.4.2 动态创建同步的 Actor
我们将添加 Switch Has Authority(或 Authority Guard)节点以 确定由 Authority(服务器)还是 Remote 机器(客户端)执行该脚本。通常,此选项将设置为 Authority,以确保只有服务器可以执行游戏性关键脚本,如调整玩家生命值或分配分数、经验等,因为你不希望让客户端通过执行此类脚本来作弊。
你现在应该可以看到,由于 Switch Has Authority 设置为 Remote,所以其下的脚本仅在客户端而非服务器上执行。 例如,你拥有玩家受到伤害时可应用的某种屏幕特效,通过将 Remote 用作 Authority Guard,你可以用这种方式只在执行脚本的远程客户端上生成该特效。
你应该会看到,由于只有服务器执行了脚本,两种喷火效果都显示在服务器上,而只有设置为同步的喷火效果显示在客户端上。当你想在服务器或客户端(而非两者)上生成某物时,或更重要的是,在服务器或客户端上执行 Switch Has Authority 节点下的任何脚本时(如上所述),此操作非常有用。
4.4.2 在蓝图中同步变量
和Actor 以及函数 一样,变量也能通过网络复制。游戏逻辑中的关键变量应该只能在网络权威(服务器)上修改,然后根据需要复制到远程设备(客户端)上。你不应该让客户端来定义何时应该修改变量,因为这会让作弊者有机可乘(例如设置生命值、弹药量或经验值)。 你可以将变量设置成Replicated,也就是说,这个变量会生成一个该变量的一对一副本,然后该副本将从服务器复制到客户端。或者你可以使用Rep Notify变量。它拥有Replicated的所有功能,同时还提供了一个函数,每当该函数关联的变量更新时,该函数就会调用并在服务器和客户端上执行。
此处,当该蓝图生成时,我们仅在授权者(服务器)上使用 Switch Has Authority 节点调用 Set Timer 函数。我们使用此节点来确保仅由服务器而非客户端执行 Timer 函数。如果此脚本要处理游戏关键数据,们仅希望服务器执行此脚本并将任何数据复制到客户端机器上,而非由客户端执行此脚本,以防任何作弊行为。
4.4.3 在蓝图中使用远程调用函数
RPC (远程过程调用)是在本地调用但在其他机器(不同于执行调用的机器)上远程执行的函数。 RPC 函数非常有用,可允许客户端或服务器通过网络连接相互发送消息。 些功能的主要作用是执行那些不可靠的暂时性/修饰性游戏事件。这其中包括播放声音、生成粒子或产生其他临时效果 之类的事件,它们对于 Actor 的正常运作并不重要。在此之前,这些类型的事件往往要通过 Actor 属性进行复制。
远程调用函数主要包括 3 种类型: Multicast 广播、 Run on Server 在服务端执行 和 Run on owning Client 在客户端执行。 广播函数Multicast在服务器上调用和执行,然后自动转发给客户端。 在服务端执行的函数Run on Server 由客户端调用,然后仅在服务器上执行。 在客户端执行的函数Run on owning Client 由服务器调用,然后仅在自有客户端上执行。
要求和注意事项
必须满足一些要求才能充分发挥 RPC 的作用:
1.它们必须从 Actor 上调用。 2.Actor 必须被复制。 3.如果 RPC 是从服务器调用(Run on Server) 并在客户端上执行,则只有实际拥有这个 Actor 的客户端才会执行函数。 4.如果 RPC 是从客户端调用(Run on owning Client )并在服务器上执行,客户端就必须拥有调用 RPC 的 Actor。 5.多播 Multicast RPC 则是个例外: . 如果它们是从服务器调用,服务器将在本地和所有已连接的客户端上执行它们。 如果它们是从客户端调用,则只在本地而非服务器上执行。
Switch Has Authority 节点用于检查当前正在运行的脚本正在从何处执行,然后基于脚本是在网络授权者(通常为服务器)还是远程机器(客户端)上运行将其分成两个不同的方向。 通常,你会对只希望在服务器上发生的事情使用授权者(这些通常为游戏关键性事件,例如调整玩家的生命值或赠送奖励或掠夺物品,因为你不想让客户端确定这些更改何时发生,以防作弊)。 在此示例中,我们将更新文本变量,此变量也完全可以是包含玩家生命值的变量,或所收集道具的变量。
|