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

PlayerData

PlayerDataは、プレイヤーに関する永続データ(ゲームのスコアやワールド内での好みなど)を保存するためのキー・バリュー型データベースです。

セットアップ

UdonBehaviourでPlayerDataを使用するには、以下に説明する各種PlayerData関数を使用するだけです。どのUdonBehaviourからでも、ほぼいつでもどこからでもこれらの関数にアクセスできます。

ベストプラクティス

  • OnPlayerDataUpdated を使用する際は、そのスクリプトの処理をローカルプレイヤーの変更のみに限定できるか、あるいはすべてのリモートプレイヤーに対してもトリガーする必要があるかを検討してください。
    • 例:ビデオプレイヤーの音量といったユーザー設定はローカルプレイヤーの更新のみで済みますが、インスタンス全体の「撫でた犬の合計数」を集計する協力型ゲームの場合は、誰かプレイヤーのスコアが増加するたびに反応して、グローバルスコアを増やす必要があります。
  • PlayerDataを使用する前に、OnPlayerRestoredイベントを待機してください。OnPlayerRestoredは、プレイヤーの保存データが読み込まれ、Udonで安全にアクセスできる状態であることを示します。このイベントは、保存データがない場合でも実行されます。
  • すべてのPlayer Keyを反復処理すると、数が多い場合に低速になる可能性があります。一般的なガイドラインとして、確認したいキーが少数である場合、あるいは10個を超えるキーを確認する必要がある場合などに適している、TryGetメソッドを使用して特定のキーの値を直接チェックしてください。

ネットワーキング

PlayerDataは、特定のUdonBehaviourに紐付いているわけではないため、UdonBehaviourの同期設定には依存しません。スクリプトの設定を「Manual」や「Continuous」ではなく「None」にしたとしても、そのスクリプトがPlayerDataにアクセスして変更を加えることができなくなることはなく、PlayerData全体の動作に悪影響を与えることもありません。

UdonBehaviourがPlayerDataの値を設定すると、PlayerDataはその値を自動的に同期します。内部的には、PlayerDataは RequestSerialization イベントを使用した手動同期と似た方法で値を送信します。つまり、UdonBehaviourは複数のPlayerDataキーを同時に設定し、それらをまとめて送信できるということです。UdonBehaviour側で各キーを個別に送信する必要はありません。同様に、UdonBehaviourがあるキーをある値に設定した後ですぐに別の値へ変更した場合、リモートユーザーはその中間値を受け取りません。データが変更される間隔が短すぎる場合、リモートユーザーは最終的な状態のみを受け取ります。

PlayerDataの 帯域幅コスト は、同期 を「Manual」に設定した1つのUdonBehaviourと同程度です。

ワールド内のすべてのUdonBehaviourは、そのワールドのPlayerDataへのアクセスを共有します。PlayerDataのキーを設定すると、ワールド内のどのUdonBehaviourからでもアクセス可能になります。PlayerDataはUdonBehaviourごとに「分離」されることはありません。

ローカルプレイヤーのデータを一つでも変更すると、変更されていないデータを含め、そのプレイヤーのPlayerDataすべてが送信されます。頻繁に更新される少量のデータや、ゆっくりと更新される大量のデータであれば、Udonの帯域幅制限に達する可能性は低いでしょう。しかし、PlayerDataを使用して大量かつ高頻度なデータを同期している場合は、そのどちらかをプレイヤーオブジェクトへ移行することを検討してください。プレイヤーオブジェクトを使用すると永続的な変数を同期できますが、各オブジェクトは個別に同期されます。これにより、高速なデータと大容量のデータを分離できるため、ワールドのネットワーク帯域幅を削減できます。

イベント

EventOutputNotes
OnPlayerDataUpdatedVRCPlayerApi player, PlayerData.Info[] infosプレイヤーのPlayerDataが変更、または受信されたフレームの終了時にトリガーされます。
そのデータに関連付けられたプレイヤーのVRCPlayerApiと、そのデータ内の全キーに関する情報が含まれる配列が提供されます。配列内の情報には、データに使用されたキーと、そのデータが変更されたか、追加されたか、あるいは変更されていないかといった状態が含まれます。
OnPlayerRestoredVRCPlayerApi playerVRChatプレイヤーの永続データが読み込まれた後にトリガーされます。
OnPersistenceUsageUpdatedVRCPlayerApi playerVRChatプレイヤーの永続化データの使用状況が更新された際にトリガーされます。
OnPlayerDataStorageExceededVRCPlayerApi playerVRChatプレイヤーのPlayerDataの使用量が、許容されているストレージ制限を超えた際にトリガーされます。
OnPlayerDataStorageWarningVRCPlayerApi playerVRChatプレイヤーのPlayerDataの使用量が、許容されているストレージ制限に近づいた際にトリガーされます。
タイミングの問題に注意してください

PlayerDataを読み書きする前に、OnPlayerRestoredイベントを待機してください。

プレイヤーが参加すると、OnPlayerJoinedイベントが呼び出されます。しかし、プレイヤーのPlayerDataが受信されるまでには追加で時間がかかる場合があります。PlayerDataを早期に設定しすぎると、永続データが受信された際に上書きされる可能性があります。

PlayerData情報

OnPlayerDataUpdatedイベントは、PlayerData.Info配列を提供します。この配列には、そのプレイヤーに関連付けられた現在のすべてのPlayerDataキーが含まれています。各要素には以下の情報が含まれます。

プロパティ備考
KeyStringクエリやミューテーターで使用可能な、PlayerDataキーに関連付けられた文字列。
StateEnumこのOnPlayerDataUpdatedが発生した時点における、PlayerDataキーの最新の状態。

State列挙型は、以下の状態を表します。

状態インデックス備考
Unchanged0前回の更新から、このキーのデータが変更されていないことを示します。
Added1前回の更新以降に、このキーが追加されたことを示します。
Removed2 このキーが前回の更新以降に削除されたことを示します。削除されたキーはこの状態として一度だけ配列に表示され、次回以降は表示されなくなります。 注意: 現在、キーを削除することはできません。このキーが前回の更新以降に削除されたことを示します。削除されたキーはこの状態として一度だけ配列に表示され、次回以降は表示されなくなります。
注意: 現在、キーを削除することはできません。
Changed3このキーのデータが前回の更新以降に変更されたことを示します。
Restored4このキーが永続的な記録から復元されたことを示します。これは、過去にそのインスタンスにいたプレイヤーが再度参加した場合にのみ発生します。

ベストプラクティス

  • OnPlayerDataUpdated を使用する際は、そのスクリプトの処理をローカルプレイヤーの変更のみに限定できるか、あるいはすべてのリモートプレイヤーに対してもトリガーする必要があるかを検討してください。
    • 例として、ビデオプレイヤーの音量設定はローカルプレイヤーに対してのみ更新すれば十分ですが、インスタンス内で「なでた犬の総数」を集計する協力型ゲームの場合は、任意のプレイヤーのスコア増加に反応してグローバルスコアを増やす必要があります。
  • OnPlayerDataRestored イベントが発生するまで、PlayerDataの使用は待機してください。OnPlayerDataRestored は、プレイヤーの保存データがロード済みであり、Udonから安全にアクセスできる状態であることを示します。
  • プレイヤーのキーをすべて反復処理すると、数が多い場合に低速になる可能性があります。一般的なガイドラインとして、確認したいキーが少数である場合、あるいは10個を超えるキーを確認する必要がある場合などに適している TryGet メソッドを使用して、特定のキーの値を直接確認してください。

メソッド

ストレージ情報

Player Data Storage(プレイヤーデータストレージ)に関するメソッドは、Player Object Storageに関するメソッドと同様に、VRC.SDKBase.Networking 名前空間に含まれています。

FunctionInputOutputNotes
GetPlayerDataStorageLimitintPlayer Dataのストレージ制限をバイト単位で返します。
GetPlayerDataStorageUsageVRCPlayerApi targetint対象プレイヤーの最後に計算されたPlayer Data Storageの使用量を返します。
RequestStorageUsageUpdatevoidローカルプレイヤーのPlayerDataおよびPlayerObjectのストレージ使用量の計算を要求します。結果は OnPersistenceUsageUpdated を通じて通知されます。

ストレージ情報は時間の経過とともに古くなる可能性があるため、更新が必要な場合があることに注意してください。RequestStorageUsageUpdate を頻繁に呼び出すことは避けてください。

クエリ

これらのメソッドは、キーに関連付けられた値についての詳細情報を取得するために使用します。キーに対して何らかの操作を行う前に、そのキーに何が存在するかを確認するのに役立ちます。

FunctionInputOutputNotes
HasKeyVRCPlayerApi player, string keybool value指定したキーの PlayerData に値が存在する場合に true を返します
GetTypeVRCPlayerApi player, string keyType指定したキーの PlayerData に含まれる値の型を取得します
TryGetTypeVRCPlayerApi player, string keyout Type t, bool success指定したキーの PlayerData に含まれる値の型を取得します。そのキーが存在しない場合は false を返します

ミューテーター

これらのメソッドは、ローカルプレイヤーの PlayerData を保存するために使用します。リモートプレイヤーのデータを設定することはできません。

値は以前と異なる型であっても上書き可能です。一度書き込まれたキーは削除できません。

FunctionInput
SetStringstring key, string value
SetBoolstring key, bool value
SetSBytestring key, sbyte value
SetBytestring key, byte value
SetBytesstring key, byte[] value
SetShortstring key, short value
SetUShortstring key, ushort value
SetIntstring key, int value
SetUIntstring key, uint value
SetLongstring key, long value
SetULongstring key, ulong value
SetFloatstring key, float value
SetDoublestring key, double value
SetQuaternionstring key, Quaternion value
SetVector4string key, Vector4 value
SetVector3string key, Vector3 value
SetVector2string key, Vector2 value
SetColorstring key, Color32 value
SetColor32string key, Color32 value

アクセサ

これらのメソッドを使用して、インスタンス内の任意のプレイヤーのPlayerDataを取得します。

キーが存在しない場合、その型のデフォルト値が返されます。例えば、PlayerData.GetInt() を呼び出した場合、0 が返されます。

例えば、string が含まれているキーに対して GetInt を使用した場合など、誤ったアクセサー型を使用した際もデフォルト値が返されます。

デフォルト値が望ましくない場合は、TryGet またはクエリを使用して、デフォルト値と欠落しているキーを区別してください。

FunctionInputOutput
GetStringVRCPlayerApi player, string keystring value
TryGetStringVRCPlayerApi player, string keystring value, bool success
GetBoolVRCPlayerApi player, string keybool value
TryGetBoolVRCPlayerApi player, string keybool value, bool success
GetSByteVRCPlayerApi player, string keysbyte value
TryGetSByteVRCPlayerApi player, string keysbyte value, bool success
GetByteVRCPlayerApi player, string keybyte value
TryGetByteVRCPlayerApi player, string keybyte value, bool success
GetBytesVRCPlayerApi player, string keybyte[] value
TryGetBytesVRCPlayerApi player, string keybyte[] value, bool success
GetShortVRCPlayerApi player, string keyshort value
TryGetShortVRCPlayerApi player, string keyshort value, bool success
GetUShortVRCPlayerApi player, string keyushort value
TryGetUShortVRCPlayerApi player, string keyushort value, bool success
GetIntVRCPlayerApi player, string keyint value
TryGetIntVRCPlayerApi player, string keyint value, bool success
GetUIntVRCPlayerApi player, string keyuint value
TryGetUIntVRCPlayerApi player, string keyuint value, bool success
GetLongVRCPlayerApi player, string keylong
TryGetLongVRCPlayerApi player, string keylong value, bool success
GetULongVRCPlayerApi player, string keyulong
TryGetULongVRCPlayerApi player, string keyulong value, bool success
GetFloatVRCPlayerApi player, string keyfloat
TryGetFloatVRCPlayerApi player, string keyfloat value, bool success
GetDoubleVRCPlayerApi player, string keydouble
TryGetDoubleVRCPlayerApi player, string keydouble value, bool success
GetQuaternionVRCPlayerApi player, string keyQuaternion
TryGetQuaternionVRCPlayerApi player, string keyout Quaternion value, bool success
GetVector4VRCPlayerApi player, string keyVector4
TryGetVector4VRCPlayerApi player, string keyout Vector4 value, bool success
GetVector3VRCPlayerApi player, string keyVector3
TryGetVector3VRCPlayerApi player, string keyout Vector3 value, bool success
GetVector2VRCPlayerApi player, string keyVector2
TryGetVector2VRCPlayerApi player, string keyout Vector2 value, bool success
GetColorVRCPlayerApi player, string keyColor
TryGetColorVRCPlayerApi player, string keyout Color value, bool success
GetColor32VRCPlayerApi player, string keyColor32
TryGetColor32VRCPlayerApi player, string keyout Color32 value, bool success

永続的なジャンプカウンター

Udon Graphにおける永続的なジャンプカウンターのサンプルスクリプト。

最終更新: