网络
多人游戏体验是 VRChat 的核心。要创建一个对玩家做出反应并在玩家之间同步数据的世界,您需要了解 VRChat 中的网络。
本指南介绍了核心网络概念,并提供了深入学习的方向。
概述
VRChat 网络围绕三个关键概念构建:
-
变量 – 变量存储可以在世界中所有玩家之间共享的数据。这些值可以表示从数字分数到对象位置或玩家状态的任何内容。当变量同步时,其更新会发送给实例中的所有玩家。
-
事件 – 事件是在特定时刻触发的动作。与持有持久值的变量不同,事件执行一次然后消失。它们可用于创建交互、触发动画或激活脚本行为。
-
所有权 – 所有权决定哪个玩家可以修改和更新网络对象。默认情况下,第一个进入实例的玩家拥有所有网络对象。所有权可以在玩家之间转移,允许不同的用户控制对象并与其他人同步其交互。
理解这些核心概念对于在 VRChat 中构建网络体验至关重要。以下部分将探讨如何有效地使用变量、事件和所有权。
使用变量进行同步
有两种类型的同步可用:
- 连续同步 – 最适合频繁更新的值(例如,正在生长的树)。
- 手动同步 – 最适合必须始终正确的关 键值(例如,计分板)。
- Udon Graph
- UdonSharp

在上图中,我们有三个不同的变量,其中'sliderValue'变量的'synced'框被选中。此 GameObject 的拥有者将负责此变量值,其更改将发送给其他所有人。
[SerializeField] private Slider slider;
[SerializeField] private Text sliderValueText;
[SerializeField, UdonSynced] private float sliderValue;
在上面的代码中,我们有三个不同的变量,其中'sliderValue'变量具有'UdonSynced'特性。此 GameObject 的拥有者将负责此变量值,其更改将发送给其他所有人。
示例:同步滑块

在此示例中,滑块的拥有者将其值同步给其他所有人。请注意,这旨在说明概念——我们将发布一个单独的示例,详细介绍具体的操作步骤。
滑块的值是 0 到 1 之间的数字,我们称之为浮点值。因此,我们创建一个变量来保存和同步此值,名为 sliderValue,类型为 float。
我们设置滑块,在拥有者移动它时更新 sliderValue。然后,此变量被打包并发送给其他所有人,以更新他们自己的 sliderValue 变量以匹配。
打包和发送变量的过程称为序列化,而接收和拆解数据称为反序列化。
当新玩家加入实例时,世界中的所有同步变量都会发送给他们,以便他们看到与其他所有人相同的内容。
使用事件进行同步
与变量不同,事件不会持久存在——它们发生然后消失。如果我们在上面的同步滑块示例中使用事件,任何加入实例的新玩家将不会同步他们的滑块。因此,事件适用于那些希望立即对当前在实例中的每个人发生的事情。
示例:泡泡枪

在此示例中,我们有一个带有粒子系统和动画器的对象,该动画器旋转泡泡棒并生成泡泡粒子。我们希望当持有棒的玩家按下触发器时,世界中的每个人都能看到这个效果。
在我们的 Udon Graph 中,我们有一个称为"Trigger"的自定义事件,它播放"Spin"动画并触发 22 个粒子发射——这只是我们图中的本地事件。
要使其对所有人生效,我们将 OnPickupUseDown 事件(在某人持有我们的泡泡枪时按下使用键时触发)与 SendCustomNetworkEvent(目标为 All)结合使用,以触发所有人的"Trigger"事件,包括对象的拥有者。
- Udon Graph
- UdonSharp

using UdonSharp;
using UnityEngine;
using VRC.Udon.Common.Interfaces;
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class BubbleGun : UdonSharpBehaviour
{
[SerializeField] private Animator animator;
[SerializeField] private ParticleSystem particles;
public override void OnPickupUseDown()
{
SendCustomNetworkEvent(NetworkEventTarget.All, nameof(Trigger));
}
public void Trigger()
{
animator.Play("Spin");
particles.Emit(22);
}
}
示例包与后续步骤
要查看这些概念的实际应用,请下载示例包:
UdonNetworkingConcepts.unitypackage
阅读以上内容并探索示例后,继续向下深入了解 VRChat 网络。
更多网络概念
- 自定义网络事件
- 如何通过网络发送和接收事件,包括参数。
- 网络变量
- 关于如何最好地使用变量保持玩家同步的更多 信息。
- 晚加入者
- 了解如何快速同步加入你世界的任何玩家与其他玩家,而不是挂起"不支持晚加入者"的牌子。
- 对象所有权
- 动态更改对象的所有权。
- 调试网络问题
- 使用调试工具跟踪同步问题。
查看导航栏以获取完整的网络相关主题列表!