Networking
マルチプレイヤー体験はVRChatの核心です。プレイヤーに反応し、プレイヤー間でデータを同期するワールドを作成するには、VRChatのネットワーキングを理解する必要があります。
このガイドでは、ネットワーキングの核心的な概念と、より深く学ぶための道筋を紹介します。
概要
VRChatのネットワーキングは、以下の3つの重要な概念を中心に構築されています。
Variables – Variables(変数)は、ワールド内のすべてのプレイヤー間で共有できるデータを格納します。これらの値は、数値のスコアからオブジェクトの位置、プレイヤーの状態まで、あらゆるものを表すことができます。変数が同期されると、その更新内容がインスタンス内の全プレイヤーに送信されます。
Events – Events(イベント)は、特定のタイミングで発生するトリガーされたアクションです。永続的な値を保持するVariablesとは異なり、Eventsは一度実行されると消滅します。これらは、インタラクションの作成、アニメーションのトリガー、スクリプト化された動作の起動などに使用できます。
Ownership – オーナーシップとは、ネットワーク上のオブジェクトをどのプレイヤーが変更・更新できるかを決定する仕組みです。デフォルトでは、インスタンスに最初に入室したプレイヤーがすべてのネットワークオブジェクトのオーナーとなります。オーナーシップはプレイヤー間で譲渡できるため、異なるユーザーがオブジェクトを制御し、他のプレイヤーとインタラクションを同期させることが可能です。
これらのコアコンセプトを理解することは、VRChatでネットワーク体験を構築する上で不可欠です。以下のセクションでは、変数、イベント、オーナーシップの効果的な使用方法について解説します。
変数を使用した同期
利用可能な同期には2つのタイプがあります:
- Continuous – 頻繁に更新される値(例:成長する木など)に最適です。
- Manual – 常に正確である必要がある重要な値(例:スコアボードなど)に最適です。
- Udon Graph
UdonSharp

上の画像には3つの異なる変数があり、'sliderValue'変数には'synced'のチェックが入っています。このGameObjectのOwnerがこの変数の値を管理し、その変更が他の全員に送信されます。
[SerializeField] private Slider slider;
[SerializeField] private Text sliderValueText;
[SerializeField, UdonSynced] private float sliderValue;
上のコードには3つの異なる変数があり、'sliderValue'変数には'UdonSynced'属性が付いています。このGameObjectのOwnerがこの変数の値を管理し、その変更が他の全員に送信されます。
例:Synced Slider

この例では、SliderのOwnerがその値を他の全員と同期させる仕組みを説明します。これはあくまで概念を理解するための例であり、具体的な実装方法を解説する例は別途公開予定です。
スライダーの値は0から1の間の数値で、これを浮動小数点数(floating point value)、略して「float」と呼びます。そこで、この値を保存および同期するための変数を作成し、名前を sliderValue、型を float とします。
スライダーが動かされたとき、Ownerが sliderValue を更新するように設定します。この変数はパッケージ化されて他のプレイヤー全員に送信され、各プレイヤーの sliderValue 変数が同期されます。
変数をパッケージ化して送信するプロセスを Serialization(シリアライズ)と呼び、データを受け取って解凍することを Deserialization(デシリアライズ)と呼びます。
新しいプレイヤーがインスタンスに参加すると、ワールド内のすべての同期された変数がそのプレイヤーに送信されるため、他のプレイヤーと同じ状態を確認できるようになります。
Using Events for Syncing
変数とは異なり、イベントは永続しません。イベントは発生すると即座に消滅します。もし上記のSynced Slider(同期スライダー)の例でイベントを使用した場合、インスタンスに途中参加したプレイヤーのスライダーは同期されません。そのためイベントは、今その瞬間にインスタンス内にいる全員に対して即座に起こしたい処理に役立ちます。
例:バブルガン

この例では、パーティクルシステムと、シャボン玉の杖を回転させて泡のパーティクルを生成するアニメーターを持つオブジェクトを使用します。杖を持っているユーザーがトリガーを引いた際、ワールドにいる全員に対してこの動作を実行させたいとします。
Udon Graphでは、「Trigger」というカスタムイベントを作成しています。このイベントは「Spin」アニメーションを再生し、22個のパーティクルをEmit(放出)させます。これはグラフ内のローカルイベントに過ぎません。
これを全員に対して反映させるため、Bubble Gunを持っているプレイヤーがUseを押したときにトリガーされる OnPickupUseDown イベントを使い、SendCustomNetworkEvent のターゲットに All を指定することで、そのオブジェクトの所有者(Owner)を含む全員に対して「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のネットワーキングをより深く掘り下げていきましょう。
その他のネットワーキングの概念
- Custom Network Events
- パラメーターを含むイベントをネットワーク越しに送受信する方法。
- Network Variables
- プレイヤー間の同期を維持するために変数を最大限に活用する方法の詳細。
- Late Joiners
- 「途中参加非対応」と掲げるのではなく、ワールドに途中参加したプレイヤーを他のプレイヤーと素早く同期させる方法を学びます。
- Object Ownership
- オブジェクトのオーナー権限を動的に変更する方法。
- Debugging Network Issues
- デバッグツールを使用して同期の問題を追跡する方法。
ネットワーキング関連のトピックの全リストは、ナビゲーションバーを参照してください。
最終更新: