オブジェクトの所有権 (Object Ownership)
はじめに
VRChatにおいて、すべてのネットワーク化された GameObject にはオーナーが存在します。オーナー権限は、どのプレイヤーがネットワーク上のオブジェクトを変更・更新できるかを決定します。インスタンス内の全プレイヤー間でオブジェクトを適切に同期させるには、オーナー権限の理解と管理が非常に重要です。
オーナーシップの仕組み
- インスタンスに最初に参加したプレイヤーが、デフォルトですべてのネットワークオブジェクトのオーナーになります。
- オーナーシップは、プレイヤー間で動的に転送できます。
- ネットワークオブジェクトのオーナーのみが、同期された Udon 変数を変更できます。
- オーナーがインスタンスから退出した場合、VRChat は自動的に新しいオーナーを割り当てます。
オーナー権限の譲渡
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 で確認できます。
プレイヤーがインスタンスマスターであるかどうかを、ワールドの特定の機能へのアクセスを制限する方法として使用してはいけません。その目的には、代わりに「インスタンスオーナー」を使用することを検討してください。
マスタープレイヤーの選出には以下のルールが適用されます。
- インスタンス内には、常に有効なマスタープレイヤーが1人存在します。
- 空だったインスタンスに最初に入室したプレイヤーが、最初のマスターになります。
- 現在のマスターがインスタンスから退出すると、マスターが変更されます。
- また、Androidを使用しており、VRChatをバックグラウンドで長時間保持していた場合もマスターが変更されることがあります。
- 現在のマスターが退出すると、
OnPlayerLeftが呼び出される前に、インスタンス内の他のプレイヤーから新しいマスターが選出されます。 - 特定のプレイヤーがマスターになることに依存してはいけません。新しいマスタープレイヤーは、サーバー側でさまざまな基準(プラットフォーム、ネットワーク状況など)に基づいて選出されます。
これらが、現在VRChatがネットワークマスターの動作に関して保証している唯一の内容です。その他に確認される動作は変更される可能性があります。
ネットワークロジックにおいて、可能であればインスタンスマスターのチェックではなく、オーナー権限のチェックを使用することを推奨します。 マスタープレイヤーが一時的に応答しなくなるシナリオが存在し、その間のイベントが実行されない可能性があります。
ベストプラクティス
- プレイヤーがオブジェクトの変数を変更できるようにしたい場合は、必ず事前に所有権の確認または要求を行ってください。
- 所有権に関連するロジックは、プレイヤーの切断や途中参加者を考慮して設計してください。
- 可能であれば Instance Master に依存することは避け、適切な所有権の処理を使用してください。
次のステップ
詳細については、以下のネットワーク関連のトピックを参照してください。
最終更新: