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

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

この例では、スライダーのOwnerが自身の値を他の全員に同期させます。これはあくまで概念を説明するためのものである点に注意してください。詳細な実装手順については、別途ガイドを公開する予定です。
スライダーの値は0から1の間の数値であり、これを浮動小数点数(floating point value)、略して float と呼びます。そこで、この値を保存および同期するための sliderValue という名前の変数を、float 型で作成します。
スライダーが動かされるたびにOwner側で sliderValue が更新されるように設定します。この変数はパッケージ化されて他の全員に送信され、受け取った側は自身の sliderValue 変数をそれに合わせて更新します。
変数をパッケージ化して送信する処理を Serialization(シリアライズ) と呼び、データを受信して展開することを Deserialization(デシリアライズ) と呼びます。
新しいプレイヤーがインスタンスに参加すると、ワールド内のすべての同期された変数がそのプレイヤーに送信され、他の全員と同じ状態が見えるようになります。
同期にイベントを使用する
変数とは異なり、イベントは残りません。発生した瞬間に消えてしまいます。前述の同期スライダーの例でイベントを使用した場合、インスタンスに新しく参加したプレイヤーのスライダーは同期されません。そのためイベントは、インスタンスに現在参加している全員に対して、即座に発生させたい事柄に適しています。
例:バブルガン

この例では、パーティクルシステムと、シャボン玉のワンドを回転させて泡のパーティクルを生成するアニメーターを持つオブジェクトを使用します。ワンドを持っているユーザーがトリガーを引いた際、ワールド内の全員に対してこの動作を実行したいとします。
Udon Graphでは、「Trigger」というカスタムイベントを作成し、そこで「Spin」アニメーションの再生と、22個のパーティクルの放出(Emit)を行っています。これはグラフ内のローカルなイベントです。
これを全員に対して実行するために、誰かがバブルガンを持って使用(Use)ボタンを押したときに発生する OnPickupUseDown イベントに接続します。そして、SendCustomNetworkEvent を使用し、ターゲットを All に設定することで、オブジェクトのオーナーを含む全員に対して「Trigger」イベントを発火させます。

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
- デバッグツールを使用して同期の問題を追跡する方法。
ネットワーク関連トピックの全リストについては、ナビゲーションバーを参照してください。
最終更新: