Skip to main content

网络

多人游戏体验是 VRChat 的核心。要创建一个对玩家做出反应并在玩家之间同步数据的世界,您需要了解 VRChat 中的网络。

本指南介绍了核心网络概念,并提供了深入学习的方向。

概述​

VRChat 网络围绕三个关键概念构建:

  • 变量 – 变量存储可以在世界中所有玩家之间共享的数据。这些值可以表示从数字分数到对象位置或玩家状态的任何内容。当变量同步时,其更新会发送给实例中的所有玩家。

  • 事件 – 事件是在特定时刻触发的动作。与持有持久值的变量不同,事件执行一次然后消失。它们可用于创建交互、触发动画或激活脚本行为。

  • 所有权 – 所有权决定哪个玩家可以修改和更新网络对象。默认情况下,第一个进入实例的玩家拥有所有网络对象。所有权可以在玩家之间转移,允许不同的用户控制对象并与其他人同步其交互。

理解这些核心概念对于在 VRChat 中构建网络体验至关重要。以下部分将探讨如何有效地使用变量、事件和所有权。

使用变量进行同步​

有两种类型的同步可用:

  1. 连续同步 – 最适合频繁更新的值(例如,正在生长的树)。
  2. 手动同步 – 最适合必须始终正确的关键值(例如,计分板)。

Udon Graph 中的变量窗口显示你创建的变量,并允许编辑其属性。

在上图中,我们有三个不同的变量,其中'sliderValue'变量的'synced'框被选中。此 GameObject 的拥有者将负责此变量值,其更改将发送给其他所有人。

示例:同步滑块​

在此示例中,滑块的拥有者将其值同步给其他所有人。请注意,这旨在说明概念——我们将发布一个单独的示例,详细介绍具体的操作步骤。

滑块的值是 0 到 1 之间的数字,我们称之为浮点值。因此,我们创建一个变量来保存和同步此值,名为 sliderValue,类型为 float。

我们设置滑块,在拥有者移动它时更新 sliderValue。然后,此变量被打包并发送给其他所有人,以更新他们自己的 sliderValue 变量以匹配。

打包和发送变量的过程称为序列化,而接收和拆解数据称为反序列化。

当新玩家加入实例时,世界中的所有同步变量都会发送给他们,以便他们看到与其他所有人相同的内容。

使用事件进行同步​

与变量不同,事件不会持久存在——它们发生然后消失。如果我们在上面的同步滑块示例中使用事件,任何加入实例的新玩家将不会同步他们的滑块。因此,事件适用于那些希望立即对当前在实例中的每个人发生的事情。

示例:泡泡枪​

在此示例中,我们有一个带有粒子系统和动画器的对象,该动画器旋转泡泡棒并生成泡泡粒子。我们希望当持有棒的玩家按下触发器时,世界中的每个人都能看到这个效果。

在我们的 Udon Graph 中,我们有一个称为"Trigger"的自定义事件,它播放"Spin"动画并触发 22 个粒子发射——这只是我们图中的本地事件。

要使其对所有人生效,我们将 OnPickupUseDown 事件(在某人持有我们的泡泡枪时按下使用键时触发)与 SendCustomNetworkEvent(目标为 All)结合使用,以触发所有人的"Trigger"事件,包括对象的拥有者。

Udon Graph 中的网络化拾取粒子

示例包与后续步骤​

要查看这些概念的实际应用,请下载示例包:

UdonNetworkingConcepts.unitypackage

阅读以上内容并探索示例后,继续向下深入了解 VRChat 网络。

更多网络概念​

  • 自定义网络事件
    • 如何通过网络发送和接收事件,包括参数。
  • 网络变量
    • 关于如何最好地使用变量保持玩家同步的更多信息。
  • 晚加入者
    • 了解如何快速同步加入你世界的任何玩家与其他玩家,而不是挂起"不支持晚加入者"的牌子。
  • 对象所有权
    • 动态更改对象的所有权。
  • 调试网络问题
    • 使用调试工具跟踪同步问题。

查看导航栏以获取完整的网络相关主题列表!