Skip to main content

后来加入者与同步问题

当玩家在某些同步变量已更改后加入 VRChat 实例时,他们需要被更新到世界的最新状态。本指南说明如何确保后来加入者体验一致且同步的世界。

VRChat 如何处理后来加入者​

当新玩家加入实例时,VRChat 会执行以下操作:

  • 通过 OnDeserialization 事件向他们发送最新的同步变量值。
  • 将对象的所有者设置为正确的玩家。
  • 事件不会重放。

确保后来加入者看到正确的状态​

1. 使用同步变量而非事件存储状态​

事件触发一次且不会持久化,意味着后来加入者错过任何基于事件的更改。应改为:

  • 将重要数据存储在 UdonSynced 变量中。
  • 确保所有者在修改手动同步的 UdonBehaviour 的同步数据后调用 RequestSerialization()。

示例:不是发送事件来开门,而是同步一个变量:

[SerializeField, UdonSynced] private bool isDoorClosed;

public void OpenDoor()
{
isDoorClosed = false;
RequestSerialization();
}

后来加入者加入时会正确接收到 isDoorClosed 状态。

2. 为后来加入者追赶对象状态​

在他们加入时应用更改。你可以在 OnDeserialization 事件中完成,一旦他们加载完成就会触发:

private GameObject lockedDoor;

public override void OnDeserialization()
{
// 根据同步状态显示或隐藏门
lockedDoor.SetActive(isDoorClosed);
}

3. 在需要时结合事件和同步变量​

如果需要,你可以从事件更改同步变量。例如,每当有人开门时更新门的同步状态,你可以向对象的拥有者发送事件:

public override void Interact()
{
SendCustomNetworkEvent(NetworkEventTarget.Owner, nameof(OpenDoor));
}

这使你无需为了设置变量而将门的拥有权更改为与之交互的玩家。