VRChat 非公式日本語ドキュメント

Network Variables

Network variables(同期変数とも呼ばれます)を使用すると、UdonスクリプトはVRChatインスタンス内の全プレイヤー間でデータを共有できます。一度だけトリガーされ永続化されないネットワークイベントとは異なり、ネットワーク変数を使用すると、途中参加者を含むすべてのプレイヤーがオブジェクトの正しい状態を確認できるようになります。

このガイドでは、ネットワーク変数の仕組み、使用すべきタイミング、そしてネットワーキングを効率的に保つためのベストプラクティスについて解説します。

同期変数の仕組み

VRChatでは、「synced」チェックボックスにチェックを入れると変数が同期されます。

IsValidノードに接続されたOnPlayerLeftイベントを示すUdon Graphのスクリーンショット

同期変数は、他の変数とは異なる動作をします:

  • UdonBehaviourで Manual Sync を使用している場合、オーナーからすべてのプレイヤーに変数を同期させるために RequestSerialization() を呼び出す必要があります。
  • UdonBehaviourで Continuous Sync を使用する場合、変数はすべてのプレイヤーに対して自動的に更新されます。
  • 同期された変数を他のプレイヤーが変更できるようにするには、スクリプトで 所有権の移譲(ownership transfer) を行う必要があります。
  • 途中参加者は、インスタンス内の他のユーザーと同様に、変数の最新の状態を受け取ります。これは同期の種類にかかわらず機能するため、ユーザーが参加した際に手動で RequestSerialization を呼び出す必要はありません。
  • すべての型の変数を同期できるわけではありません。例えば、シーン内のオブジェクトへの参照を同期することはできません。サポートされている型はこちらに記載されています。

変数の同期タイプ

利用可能な同期には2つのタイプがあります:

1. Continuous Sync

  • オーナーが値を変更した際、自動的に更新されます。
  • 頻繁に更新される値(プログレスバーやプレイヤーの位置トラッカーなど)に最適です。
  • 更新間の変化を滑らかにするために補間(interpolation)を適用できます。
  • RequestSerialization() を呼び出す必要はありません - 更新は定期的に送信されます。

2. Manual Sync

  • データの更新を送信するには、RequestSerialization() を呼び出す必要があります。
  • スコアボードやゲームの状態変数など、頻繁には変化しない重要な値に最適です。
  • 不要なネットワークトラフィックを削減するのに役立ちます。

同期モードの設定

インスペクターでSync Typeを設定する方法

上図のように、UdonBehaviourのインスペクターにあるSynchronizationドロップダウンを使用して同期モードを設定できます。

UdonSharpBehaviourの場合は、以下の例のように UdonBehaviourSyncMode 属性を使用してスクリプトから制御することも可能です。

[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)]
public class Example : UdonSharpBehaviour
{
// This class's sync mode is manual.
}

例: マニュアル同期の使用

[SerializeField, UdonSynced] private bool isDoorOpen;

public void ToggleDoor()
{
isDoorOpen = !isDoorOpen;
RequestSerialization(); // Manually send update to all players
}

変数を用いた途中参加者の処理

途中参加者向けに同期変数を扱う方法を必ず学習してください!

ネットワーク互換性の取り扱い

ワールドのネットワーク互換性が、プラットフォームやリリースバージョンをまたいでどのように決定されるか、必ず確認してください。

最終更新: