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

オブジェクトの所有権 (Object Ownership)

はじめに

VRChatにおいて、すべてのネットワーク化された GameObject にはオーナーが存在します。オーナー権限は、どのプレイヤーがネットワーク上のオブジェクトを変更・更新できるかを決定します。インスタンス内の全プレイヤー間でオブジェクトを適切に同期させるには、オーナー権限の理解と管理が非常に重要です。

オーナーシップの仕組み

オーナー権限の譲渡

Udonを使用してオブジェクトのオーナー権限を譲渡することができます。

Networking.SetOwner(VRCPlayerApi player, GameObject obj);

例: オブジェクトのオーナー権限を変更する

プレイヤーがオブジェクトをインタラクトした際に、そのプレイヤーにオーナー権限を移動させたい場合は以下のようにします。

public override void Interact()
{
    Networking.SetOwner(Networking.LocalPlayer, gameObject);
}

この関数が実行されると、ローカルプレイヤーがそのオブジェクトの新しいオーナーになります。

Ownership イベント

VRChat では、オーナーシップ(所有権)に関連する重要なイベントが 2 つ提供されています。

OnOwnershipRequest

このイベントはオーナーシップが転送されるに呼び出されます。これにより、リクエストを承認または拒否することができます。

public override bool OnOwnershipRequest(VRCPlayerApi requestingPlayer, VRCPlayerApi newOwner)
{
    return true; // Approve transfer
}

OnOwnershipTransferred

オブジェクトのオーナーシップが変更されたときにトリガーされます。これを利用して、オーナーシップが移行した際に UI 要素やその他の挙動を更新できます。

public override void OnOwnershipTransferred(VRCPlayerApi newOwner)
{
    Debug.Log($"New owner: {newOwner.displayName}");
}

所有権転送イベントの図

この図はイベントの発生順序を示しており、オブジェクトの所有権を正常に転送するまでの手順を理解するのに役立ちます。

インスタンスマスター

インスタンスマスターとは、手動でオーナー権限の設定や転送が行われていないすべてのオブジェクトを所有するプレイヤーのことです。プレイヤーがマスターかどうかは、VRCPlayerApi.isMaster で確認できます。

プレイヤーがインスタンスマスターであるかどうかを、ワールドの特定の機能へのアクセスを制限する方法として使用してはいけません。その目的には、代わりに「インスタンスオーナー」を使用することを検討してください。

マスタープレイヤーの選出には以下のルールが適用されます。

これらが、現在VRChatがネットワークマスターの動作に関して保証している唯一の内容です。その他に確認される動作は変更される可能性があります。

マスターへの依存は可能な限り避けてください!

ネットワークロジックにおいて、可能であればインスタンスマスターのチェックではなく、オーナー権限のチェックを使用することを推奨します。 マスタープレイヤーが一時的に応答しなくなるシナリオが存在し、その間のイベントが実行されない可能性があります。

ベストプラクティス

次のステップ

詳細については、以下のネットワーク関連のトピックを参照してください。

最終更新: