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を使用して大量かつ高頻度なデータを同期している場合は、そのどちらかをプレイヤーオブジェクトへ移行することを検討してください。プレイヤーオブジェクトを使用すると永続的な変数を同期できますが、各オブジェクトは個別に同期されます。これにより、高速なデータと大容量のデータを分離できるため、ワールドのネットワーク帯域幅を削減できます。
イベント
| Event | Output | Notes |
|---|---|---|
OnPlayerDataUpdated | VRCPlayerApi player, PlayerData.Info[] infos | プレイヤーのPlayerDataが変更、または受信されたフレームの終了時にトリガーされます。 そのデータに関連付けられたプレイヤーのVRCPlayerApiと、そのデータ内の全キーに関する情報が含まれる配列が提供されます。配列内の情報には、データに使用されたキーと、そのデータが変更されたか、追加されたか、あるいは変更されていないかといった状態が含まれます。 |
| OnPlayerRestored | VRCPlayerApi player | VRChatプレイヤーの永続データが読み込まれた後にトリガーされます。 |
| OnPersistenceUsageUpdated | VRCPlayerApi player | VRChatプレイヤーの永続化データの使用状況が更新された際にトリガーされます。 |
| OnPlayerDataStorageExceeded | VRCPlayerApi player | VRChatプレイヤーのPlayerDataの使用量が、許容されているストレージ制限を超えた際にトリガーされます。 |
| OnPlayerDataStorageWarning | VRCPlayerApi player | VRChatプレイヤーのPlayerDataの使用量が、許容されているストレージ制限に近づいた際にトリガーされます。 |
PlayerDataを読み書きする前に、OnPlayerRestoredイベントを待機してください。
プレイヤーが参加すると、OnPlayerJoinedイベントが呼び出されます。しかし、プレイヤーのPlayerDataが受信されるまでには追加で時間がかかる場合があります。PlayerDataを早期に設定しすぎると、永続データが受信された際に上書きされる可能性があります。
PlayerData情報
OnPlayerDataUpdatedイベントは、PlayerData.Info配列を提供します。この配列には、そのプレイヤーに関連付けられた現在のすべてのPlayerDataキーが含まれています。各要素には以下の情報が含まれます。
| プロパティ | 型 | 備考 |
|---|---|---|
Key | String | クエリやミューテーターで使用可能な、PlayerDataキーに関連付けられた文字列。 |
State | Enum | このOnPlayerDataUpdatedが発生した時点における、PlayerDataキーの最新の状態。 |
State列挙型は、以下の状態を表します。
| 状態 | インデックス | 備考 |
|---|---|---|
Unchanged | 0 | 前回の更新から、このキーのデータが変更されていないことを示します。 |
Added | 1 | 前回の更新以降に、このキーが追加されたことを示します。 |
Removed | 2 このキーが前回の更新以降に削除されたことを示します。削除されたキーはこの状態として一度だけ配列に表示され、次回以降は表示されなくなります。 注意: 現在、キーを削除することはできません。 | このキーが前回の更新以降に削除されたことを示します。削除されたキーはこの状態として一度だけ配列に表示され、次回以降は表示されなくなります。 注意: 現在、キーを削除することはできません。 |
Changed | 3 | このキーのデータが前回の更新以降に変更されたことを示します。 |
Restored | 4 | このキーが永続的な記録から復元されたことを示します。これは、過去にそのインスタンスにいたプレイヤーが再度参加した場合にのみ発生します。 |
ベストプラクティス
OnPlayerDataUpdatedを使用する際は、そのスクリプトの処理をローカルプレイヤーの変更のみに限定できるか、あるいはすべてのリモートプレイヤーに対してもトリガーする必要があるかを検討してください。- 例として、ビデオプレイヤーの音量設定はローカルプレイヤーに対してのみ更新すれば十分ですが、インスタンス内で「なでた犬の総数」を集計する協力型ゲームの場合は、任意のプレイヤーのスコア増加に反応してグローバルスコアを増やす必要があります。
OnPlayerDataRestoredイベントが発生するまで、PlayerDataの使用は待機してください。OnPlayerDataRestoredは、プレイヤーの保存データがロード済みであり、Udonから安全にアクセスできる状態であることを示します。- プレイヤーのキーをすべて反復処理すると、数が多い場合に低速になる可能性があります。一般的なガイドラインとして、確認したいキーが少数である場合、あるいは10個を超えるキーを確認する必要がある場合などに適している
TryGetメソッドを使用して、特定のキーの値を直接確認してください。
メソッド
ストレージ情報
Player Data Storage(プレイヤーデータストレージ)に関するメソッドは、Player Object Storageに関するメソッドと同様に、VRC.SDKBase.Networking 名前空間に含まれています。
| Function | Input | Output | Notes |
|---|---|---|---|
GetPlayerDataStorageLimit | int | Player Dataのストレージ制限をバイト単位で返します。 | |
GetPlayerDataStorageUsage | VRCPlayerApi target | int | 対象プレイヤーの最後に計算されたPlayer Data Storageの使用量を返します。 |
RequestStorageUsageUpdate | void | ローカルプレイヤーのPlayerDataおよびPlayerObjectのストレージ使用量の計算を要求します。結果は OnPersistenceUsageUpdated を通じて通知されます。 |
ストレージ情報は時間の経過とともに古くなる可能性があるため、更新が必要な場合があることに注意してください。RequestStorageUsageUpdate を頻繁に呼び出すことは避けてください。
クエリ
これらのメソッドは、キーに関連付けられた値についての詳細情報を取得するために使用します。キーに対して何らかの操作を行う前に、そのキーに何が存在するかを確認するのに役立ちます。
| Function | Input | Output | Notes |
|---|---|---|---|
HasKey | VRCPlayerApi player, string key | bool value | 指定したキーの PlayerData に値が存在する場合に true を返します |
GetType | VRCPlayerApi player, string key | Type | 指定したキーの PlayerData に含まれる値の型を取得します |
TryGetType | VRCPlayerApi player, string key | out Type t, bool success | 指定したキーの PlayerData に含まれる値の型を取得します。そのキーが存在しない場合は false を返します |
ミューテーター
これらのメソッドは、ローカルプレイヤーの PlayerData を保存するために使用します。リモートプレイヤーのデータを設定することはできません。
値は以前と異なる型であっても上書き可能です。一度書き込まれたキーは削除できません。
| Function | Input |
|---|---|
SetString | string key, string value |
SetBool | string key, bool value |
SetSByte | string key, sbyte value |
SetByte | string key, byte value |
SetBytes | string key, byte[] value |
SetShort | string key, short value |
SetUShort | string key, ushort value |
SetInt | string key, int value |
SetUInt | string key, uint value |
SetLong | string key, long value |
SetULong | string key, ulong value |
SetFloat | string key, float value |
SetDouble | string key, double value |
SetQuaternion | string key, Quaternion value |
SetVector4 | string key, Vector4 value |
SetVector3 | string key, Vector3 value |
SetVector2 | string key, Vector2 value |
SetColor | string key, Color32 value |
SetColor32 | string key, Color32 value |
アクセサ
これらのメソッドを使用して、インスタンス内の任意のプレイヤーのPlayerDataを取得します。
キーが存在しない場合、その型のデフォルト値が返されます。例えば、PlayerData.GetInt() を呼び出した場合、0 が返されます。
例えば、string が含まれているキーに対して GetInt を使用した場合など、誤ったアクセサー型を使用した際もデフォルト値が返されます。
デフォルト値が望ましくない場合は、TryGet またはクエリを使用して、デフォルト値と欠落しているキーを区別してください。
| Function | Input | Output |
|---|---|---|
GetString | VRCPlayerApi player, string key | string value |
TryGetString | VRCPlayerApi player, string key | string value, bool success |
GetBool | VRCPlayerApi player, string key | bool value |
TryGetBool | VRCPlayerApi player, string key | bool value, bool success |
GetSByte | VRCPlayerApi player, string key | sbyte value |
TryGetSByte | VRCPlayerApi player, string key | sbyte value, bool success |
GetByte | VRCPlayerApi player, string key | byte value |
TryGetByte | VRCPlayerApi player, string key | byte value, bool success |
GetBytes | VRCPlayerApi player, string key | byte[] value |
TryGetBytes | VRCPlayerApi player, string key | byte[] value, bool success |
GetShort | VRCPlayerApi player, string key | short value |
TryGetShort | VRCPlayerApi player, string key | short value, bool success |
GetUShort | VRCPlayerApi player, string key | ushort value |
TryGetUShort | VRCPlayerApi player, string key | ushort value, bool success |
GetInt | VRCPlayerApi player, string key | int value |
TryGetInt | VRCPlayerApi player, string key | int value, bool success |
GetUInt | VRCPlayerApi player, string key | uint value |
TryGetUInt | VRCPlayerApi player, string key | uint value, bool success |
GetLong | VRCPlayerApi player, string key | long |
TryGetLong | VRCPlayerApi player, string key | long value, bool success |
GetULong | VRCPlayerApi player, string key | ulong |
TryGetULong | VRCPlayerApi player, string key | ulong value, bool success |
GetFloat | VRCPlayerApi player, string key | float |
TryGetFloat | VRCPlayerApi player, string key | float value, bool success |
GetDouble | VRCPlayerApi player, string key | double |
TryGetDouble | VRCPlayerApi player, string key | double value, bool success |
GetQuaternion | VRCPlayerApi player, string key | Quaternion |
TryGetQuaternion | VRCPlayerApi player, string key | out Quaternion value, bool success |
GetVector4 | VRCPlayerApi player, string key | Vector4 |
TryGetVector4 | VRCPlayerApi player, string key | out Vector4 value, bool success |
GetVector3 | VRCPlayerApi player, string key | Vector3 |
TryGetVector3 | VRCPlayerApi player, string key | out Vector3 value, bool success |
GetVector2 | VRCPlayerApi player, string key | Vector2 |
TryGetVector2 | VRCPlayerApi player, string key | out Vector2 value, bool success |
GetColor | VRCPlayerApi player, string key | Color |
TryGetColor | VRCPlayerApi player, string key | out Color value, bool success |
GetColor32 | VRCPlayerApi player, string key | Color32 |
TryGetColor32 | VRCPlayerApi player, string key | out Color32 value, bool success |
例
永続的なジャンプカウンター
- Udon Graph
UdonSharp

using TMPro;
using UdonSharp;
using VRC.SDK3.Persistence;
using VRC.SDKBase;
using VRC.Udon.Common;
public class JumpCounter : UdonSharpBehaviour
{
public TextMeshProUGUI jumpText;
private const string JumpsKey = "jumps";
public override void InputJump(bool value, UdonInputEventArgs args)
{
if (value)
{
AddJump();
}
}
public override void OnPlayerDataUpdated(VRCPlayerApi player, PlayerData.Info[] infos)
{
if (player.isLocal)
{
UpdateTextComponent();
}
}
private void AddJump()
{
var currentJumps = PlayerData.GetInt(Networking.LocalPlayer, JumpsKey);
PlayerData.SetInt(JumpsKey, currentJumps + 1);
}
private void UpdateTextComponent()
{
jumpText.text = $"Jumps: {PlayerData.GetInt(Networking.LocalPlayer, JumpsKey)}";
}
}
最終更新: