Skip to main content

网络变量

网络变量(也称为同步变量)允许 Udon 脚本在 VRChat 实例中的所有玩家之间共享数据。与触发一次且不会持久化的网络事件不同,网络变量确保所有玩家(包括后来加入的人)都能看到对象的正确状态。

本指南涵盖网络变量的工作方式、何时使用它们以及保持网络高效的实践建议。

同步变量如何工作​

如果勾选了"synced"复选框,VRChat 会同步该变量。

一个 Udon Graph 截图,显示 OnPlayerLeft 事件连接到 IsValid 节点。

同步变量行为不同​

同步变量的行为与其他变量不同:

  • 如果你的 UdonBehaviour 使用手动同步,它必须调用 RequestSerialization() 以将变量从拥有者同步给所有玩家。
  • 如果你的 UdonBehaviour 使用连续同步,变量将自动为所有玩家更新。
  • 你的脚本必须执行所有权转移以允许其他玩家修改同步变量。
  • 后来加入者会收到变量的最新状态,就像实例中的其他用户一样。无论同步类型如何,这都适用,你不需要在用户加入时手动调用 RequestSerialization。
  • 并非所有类型的变量都可以同步。例如,你不能同步对场景对象的引用。支持的类型列在此处。

变量同步类型​

有两种同步类型可用:

1. 连续同步​

  • 当拥有者更改值时自动更新。
  • 最适合频繁更新的值(例如,进度条、玩家位置追踪器)。
  • 可以应用插值来平滑更新之间的变化。
  • 不需要调用 RequestSerialization() - 更新将定期发送。

2. 手动同步​

  • 需要调用 RequestSerialization() 来发送数据更新。
  • 最适合不经常更改的关键值(例如,计分板、游戏状态变量)。
  • 有助于减少不必要的网络流量。

设置同步模式​

显示如何在检查器中设置同步类型

你可以使用 UdonBehaviour 检查器中的 Synchronization 下拉菜单来设置其同步模式,如上图所示。

对于 UdonSharpBehaviours,你也可以使用 UdonBehaviourSyncMode 特性从脚本控制此设置,如下所示。

[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class Example : UdonSharpBehaviour
{
// 此类的同步模式为手动。
}

示例:使用手动同步​

[SerializeField, UdonSynced] private bool isDoorOpen;

public void ToggleDoor()
{
isDoorOpen = !isDoorOpen;
RequestSerialization(); // 手动发送更新给所有玩家
}

使用变量处理后来加入者​

请务必了解如何为后来加入者同步变量!

处理网络兼容性​

请务必查看如何确定世界跨平台变体和发布版本的网络兼容性。