在蓝图中同步变量

在蓝图中使用 Replicated 和 RepNotify 变量的指南。

Choose your operating system:

Windows

macOS

Linux

本页面的内容

Actor 以及 函数 一样,变量也能通过网络复制。游戏逻辑中的关键变量应该只能在网络权威(服务器)上修改该,然后根据需要复制到远程设备(客户端)上。你不应该让客户端来定义何时应该修改变量,因为这会让作弊者有机可乘(例如设置生命值、弹药量或经验值)。

你可以讲变量设置成Replicated,也就是说,这个变量会生成一个该变量的一对一副本,然后该副本将从服务器复制到客户端。或者你可以使用RepNotify变量。它拥有Replicated的所有功能,同时还提供了一个函数,每当该函数关联的变量更新时,该函数就会调用并在服务器和客户端上执行。

本页通过具体案例介绍了 Replicated RepNotify 变量的作用。

Replicated

在此示例中,我们使用的是带有 初学者内容包 第三人称模板

在此示例中,我们将创建 Replicated 变量,该变量用于服务器和客户端均可查看的倒数计时器。

  1. Content/StarterContent/Blueprints 文件夹中,打开 Blueprint_Effect_Fire 蓝图。

  2. 选中 Class Defaults 后,在 Replication 下的 Details 面板中,选中 Replicates 选项。

    HT_0.png

    此操作将确保此蓝图通过网络复制到所有连接的机器上。

  3. Components 窗口中,单击 Add Component 按钮,然后搜索并添加 Text Render 组件。

    HT_1.png

  4. Viewport 选项卡上,将文本移到喷火上方的所需位置,以便其更加明显可见。

    HT_2.png

  5. 单击 Event Graph 选项卡,在图表中 Right-click 并添加 Event Begin Play 节点。

  6. 拖出 Event Begin Play 引脚,搜索并添加 Switch Has Authority 节点。

  7. 拖出 Authority 引脚并添加 Set Timer 节点,同时将 Time 设置为 1 并选中 Looping

    HT_3.png

    此处,当该蓝图生成时,我们仅在授权者(服务器)上使用 Switch Has Authority 节点调用 Set Timer 函数。我们使用此节点来确保仅由服务器而非客户端执行 Timer 函数。如果此脚本要处理游戏关键数据,们仅希望服务器执行此脚本并将任何数据复制到客户端机器上,而非由客户端执行此脚本,以防任何作弊行为。

  8. MyBlueprint 窗口中,创建命名为 CountDownTimer 的新变量。

  9. 在此变量的 Details 面板中,将其更改为 Integer 类型,然后 Compile 并将 Default Value 设置为 10

    HT_4.png

  10. 在图表中 右键 ,然后创建新的 Custom Event 并命名为 Update Timer

  11. Update Timer 连接到 Branch 节点,然后从 True 连出来,加一个 Set CountDownTimer 节点。

  12. 在图表中 Right-click 并添加 Get CountDownTimer 节点,然后将其拖开,再使用 Int - Int 节点并在文本框中输入 1。

  13. 再次拖出 CountDownTimer 节点并使用 Int > Int 节点,然后按如下所示连接节点。

    HT_5.png

    此处,我们将指示 CountDownTimer 在每次调用 UpdateTimer 且其大于 0 时从其中减去 1。

  14. Set Timer 节点上的 Function Name 下,添加自定义事件( UpdateTimer )的名称。

    HT_6.png

    此操作现在每秒调用一次 UpdateTimer 事件,直到我们指示计时器停止。

  15. 在图表中 右键 并添加 Event Tick 节点。

  16. 按住 Control 并从 MyBlueprint 窗口拖入 TextRender 组件,然后将其拖出并使用 Set Text 节点。

  17. 按住 Control 并拖入 CountDownTimer 变量,然后将其插入 Set Text 节点的 Value

    HT_7.png

    此时将自动创建转换节点,而且我们要将文本设置为倒数计时器的值。

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

  19. Content Browser 中,将 Blueprint_Effect_Fire 拖入关卡中。

    HT_9.png

  20. 在主工具栏上,单击 Play 按钮旁的下箭头,然后将 Number of Players 设置为 2。

    NoOfPlayers.png

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

    点击查看大图。

    在编辑器中游戏时,你应该会看到 Server 倒数至 0,而 Client 却不会。

  22. 返回 Blueprint_Effect_Fire 蓝图。

  23. CountDownTimer 变量的 Details 面板中,在 Replication 下,将其设置为 Replicated

    HT_12.png

    此操作将使该属性复制到连接的机器上。

  24. 此表格将更新且每个 CountDownTimer 变量的实例将包含一个复制图标。

    HT_13.png

  25. 编译 保存 ,关闭蓝图,然后在编辑器中开始游戏。

    点击查看大图。

    现在,你可以看到服务器和客户端均从 10 开始倒数并显示相应文本。当我们使用整数更新文本渲染时,可轻松使用该变量表示玩家角色的生命、弹药或其他游戏性相关变量。

RepNotify

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

在上述 Replicated 示例中,我们创建了同时在服务器和客户端上显示的倒数计时器。在此示例中,我们将使用 RepNotify 变量,以指示当倒数计时器倒数至 0 时,我们将停用服务器和客户端机器上的喷火效果。

  1. 打开 Blueprint_Effect_Fire 蓝图。

  2. MyBlueprint 窗口中,按住 Control 并拖入 P_Fire 效果,然后将其拖出并使用 Deactivate 节点。

  3. 从在连接到 UpdateTimer Branch False 连线出来,按如下所示连接 Deactivate 节点。

    HT_15.png

    此处,我们指的是当调用 UpdateTimer 时,执行 CountDownTimer 并从其中减去 1(只要它大于 0)。如果它不大于 0,则 Deactivate P_Fire 粒子效果。

  4. 编译 保存 ,关闭蓝图,然后在编辑器中开始游戏。

    点击查看大图。

    在编辑器中玩游戏时,你将看到倒数至 0 时,仅在服务器上停用喷火效果。

  5. 返回 Blueprint_Effect_Fire 蓝图,然后创建称为 Deactivate Boolean 类型的新变量。

  6. Deactivate 变量上,确保 Replication 类型设置为 RepNotify

    HT_17.png

  7. 将变量设置为 RepNotify 后,你将看到已自动创建新的函数。

    HT_18.png

    当指派为 RepNotify 的变量发生更改时,将调用并同时在服务器和客户端机器上执行此函数。

  8. 双击 On Rep Deactivate 函数以将其打开。

  9. 按住 Control 并拖入 P_Fire 组件,然后从它连出来,添加 Deactivate 节点。

    HT_19.png

  10. 返回 Event Graph 并定位 UpdateTimer 事件。

  11. Branch False 连出来,添加 Set Deactivate 节点,然后选中将其设置为 True

    HT_20.png

    你可以看到该变量还显示 Set w/Notify ,表示也将调用通知函数。

  12. 编译 保存 ,关闭蓝图,然后在编辑器中开始游戏。

    点击查看大图。

    此时在编辑器中玩游戏时,你将看到计时器倒数至 0 时,客户端和服务器均会停用喷火效果。

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消