永続性 (Persistence)
永続化(Persistence)とは?
永続化(Persistence)を使用すると、ワールド内でハイスコア、インベントリ、プレイヤーの最終位置、通貨、アンロック要素、各種設定などを保存できるようになります。プレイヤーがワールドから退出して後で戻ってきたとき、Udonはその保存されたデータにアクセス可能です。
このデータはVRChatのサーバーに保存され、すべてのプラットフォームおよび同じワールドのすべてのインスタンスでアクセスできます。データはユーザーのアカウントに紐付いているため、プレイヤーがまったく異なるデバイスから同じワールドにアクセスした場合でも、Udonはそのワールドのデータにアクセスできます。
永続化を利用する主要な方法の一つが PlayerData です。PlayerDataは各プレイヤーに関連付けられたキー・値(Key-Value)形式のストレージシステムです。あらゆるスクリプトからデータにアクセスでき、すべての整数型、float、double、Vector、Color、文字列、およびバイト配列を保存可能です。
永続化には PlayerObjects も含まれます。このコンポーネントを持つゲームオブジェクトは、各プレイヤーに対して自動的にインスタンス化されます。UdonスクリプトをPlayerObjectsにアタッチすることができ、さらにそこに VRCEnablePersistence コンポーネントを追加すれば、それらのオブジェクト上の同期されたすべてのデータが永続化されます。PlayerObjectsには永続化以外にも多くの用途があり、プレイヤーごとのオブジェクトプールと同様のユースケースで機能します。ヘルスバー、戦闘システム用のコライダー、オーナー権限の移譲を必要としない堅牢なネットワークシステムなど、インスタンス内の各プレイヤーに紐付けるべきあらゆるものに使用できます。
Persistenceの使用例
Persistence Examplesを参照して、UnityでPersistenceを試してみてください。すべてのサンプルはExample Centralで入手可能です。
永続的なユーザーデータ
Persistence(永続化)によって保存されるデータは「User Data」と呼ばれます。Persistenceには、UdonがVRChatのサーバーに対して保存および読み込みを行える2種類のUser Dataが存在します。
- PlayerData は、UdonスクリプトでUser Dataの保存と読み込みが可能なキー・バリューストア形式のデータベースです。
- PlayerObject は、各プレイヤーに対して自動的にインスタンス化されるGameObjectです。
VRCEnablePersistenceコンポーネントが指定されている場合、同期されるすべてのUdon変数を永続化できます。
各環境におけるデータストレージ
開発中にワールドをテストする場合、ユーザーデータ(User Data)は以下の場所に保存されます。
- アップロードされたワールド:
- 永続データは、アカウントに紐付いたVRChatのサーバー上に保存されます。どのデバイスからワールドを訪れても、データを利用できます。
- 同じアカウントで同じワールドを同時に複数回開くと、競合が発生し、意図せず自身のデータを上書きしてしまう可能性があります。
- ローカルテストワールド
- "Build & Test" を実行した場合、ユーザーデータはローカルに保存されます。
- テストクライアントを起動した際、ユーザーデータは空の状態から始まります。
- 再接続(rejoin)や "Build & Reload" を行っても、ユーザーデータはリセットされません。
- テストクライアントを終了すると、そのユーザーデータは削除されます。
- "Number of Clients" を2以上に設定した場合、ユーザーデータは各テストクライアントごとに個別に保存されます。
- "Build & Test" を実行した場合、ユーザーデータはローカルに保存されます。
- ClientSim
- 永続データはプロジェクト内のJSONファイルに保存されます。
- 詳細は ClientSim Persistence documentation を参照してください。
制限事項
ワールドでPersistenceを使用する際は、以下の制限事項に留意してください。
- 各ワールドは、VRChatのサーバー上でプレイヤー1人につき100キロバイト(KB)の
PlayerDataと100 KBのPlayerObjectデータを保存できます。- VRChatはユーザーデータを圧縮形式で保存します。ワールドのデータが圧縮しやすいものであれば、300 KB以上(VRChatによって100 KBに圧縮)保存できる可能性があります。
- この制限を超えるデータを保存することはできません。制限を超えた場合、VRChatはエラーをログに記録し、データは保存されません。これを回避するためにデータサイズを削減してください。
- ローカルプレイヤーのユーザーデータは、ワールドから退出する前に保存する必要があります。永続データは、ローカルプレイヤーの OnPlayerLeft イベント内では保存できません。
- 永続データは異なるワールド間で共有することはできません。
- Persistenceには「セーブスロット」機能は組み込まれていません。ただし、ワールド制作者はUdonを使用して、ワールド内にセーブスロットシステムを構築することができます。
永続的なプレハブの作成
永続的な動作を持つプレハブを作成する際は、作成者のプロジェクト内にある他のプレハブとどのように相互作用するかを考慮することが重要です。
まず、ほとんどの プレハブに適している PlayerData ではなく PlayerObjects の使用を検討してください。PlayerObjects はプレハブの階層内に適切に収められており、大量のデータや頻繁に変更されるデータの永続化に適しています。ローカルプレイヤーの PlayerData をすべて変更すると、変更されていないデータを含め、すべての PlayerData が送信される点に注意してください。ワールド内で PlayerData を使用するプレハブが増えるたびにこの収集データが増加し、毎回送信が必要となるため、ワールドのネットワーク使用量が急速に増大し、帯域幅の問題を引き起こす可能性があります。
それでもプレハブのデータの一部に PlayerData が適している場合は、プレハブで使用するすべてのキーにプレフィックス(接頭辞)を追加することを検討してください。例えば、Momoさんの永続的なポストプロセス設定であれば、「Momo-PPP-」というプレフィックスを選択し、以下のようなキーを使用します。
- Momo-PPP-BloomAmount
- Momo-PPP-Vignette
- Momo-PPP-Weight
このアプローチにより、他のプレハブと名前が競合する可能性を大幅に減らすことができます。例えば上記の「Weight」キーは、2つの異なるプレハブが「Weight」パラメータを持っていると簡単に競合してしまいますが、他のプレハブがプレフィックスとして「Momo-PPP」を使用する可能性は非常に低いでしょう。
ユーザーデータの削除
この操作は元に戻せません!ユーザーデータを削除した後に復元することはできません。
自身の永続的なユーザーデータを削除することができます。これにより、あなた(またはプレイヤー)は「最初からやり直す」ことや、技術的な問題を解決することが可能です。
ユーザーデータをリセットする方法は、VRChat内および弊社のウェブサイト上の両方に複数存在します。
VRChat内から
VRChat内でユーザーデータをリセットするのが最も簡単な方法です。
特定のワールドのデータ
以下の手順で、任意のワールドのユーザーデータを削除できます:
- VRChatのメインメニューからワールドを選択します。
- 下にスクロールして「Actions」セクションを表示します。
- 「Reset User Data」を選択します。
- このボタンは、そのワールドのユーザーデータを持っている場合にのみ表示されます。
- 「YES, RESET」を選択します。
現在永続データを持つワールドにいる場合は、ユーザーデータをリセットする前に、そのワールドから退出するか再入室する必要があるかもしれません。
すべてのワールドのデータ
以下の手順で、訪れたことのあるすべてのワールドのユーザーデータを削除することもできます:
- VRChatのメインメニューから設定を開きます。
- 「Debug」セクションを選択します。
- 下にスクロールして「User Data」セクションを表示します。
- 「Reset All User Data」を選択します。
- 「YES, RESET」を選択します。
VRChatウェブサイトから
VRChatのウェブサイト上でもユーザーデータをリセットできます。必ずVRChatアカウントを持っていることを確認してください。Meta、Pico、またはViveportのアカウントのみをお持ちの場合は、あらかじめVRChatアカウントにリンクさせる必要があります。
特定のワールドのデータ
以下の手順で、特定のワールドの自身のユーザーデータをリセットできます:
- VRChat.com上のワールドページを開きます。
- 下にスクロールして「User Data」セクションを表示します。
- そのワールドのユーザーデータを持っていない場合、このセクションは表示されません。
- Reset User Dataをクリックします。
- 警告を読んだ後、Yesをクリックして確定します。
すべてのワールドのデータ
VRChatのウェブサイトにアクセスして、訪れたことのあるすべてのワールドの自身のユーザーデータをリセットできます:
- VRChat.comの設定ページを開きます。
- 下にスクロールしてPersistent Dataセクションを表示します。
- Reset All User Dataをクリックします。
- 警告を読んだ後、Yesをクリックして確定します。
最終更新: