PlayFab におけるデータ管理では、プレイヤーデータとタイトルデータの理解が欠かせません。
この2つのデータを使用しないで PlayFab を使うことはあり得ないでしょう。
幸い、各データを操作すること自体は簡単にできるようになっています。
しかし、細かいところや少し踏み込んだ内容については、公式ドキュメントから読み取れない部分も多いです。
そこでこの記事では、それぞれのデータの概念や応用した使い方について解説しました。
読み終える頃には、実装の幅が広がっているだけでなく、セキュリティ面も意識した実装もできるようになっているはずです。
では、さっそく見ていきましょう。
プレイヤーデータとタイトルデータとは
まずは、プレイヤーデータとタイトルデータの概念について解説していきます。
図を用意したので、こちらをご覧ください。
プレイヤーデータとは、それぞれのプレイヤーが持っているデータのことです。
使用例としては、以下があります。
- 経験値
- ランク
- 名前
他にも必要に応じて、ユーザーごとにデータをもたせることが可能です。
また、タイトルデータとは、「ユーザー全員が共通して使うデータ」のことです。
「マスタデータ」というと伝わりやすいでしょうか?
例えば、以下のようなデータですね。
- 経験値テーブル
- モンスター情報
- クエスト情報
上記のような情報は、ユーザーに持たせると膨大な量になってしまうので、全員で共通の場所を見るようにします。
概念については理解できましたか?
では、次からはもう少し踏み込んで見てみましょう。
一歩先のデータ管理を理解する
プレイヤーデータに関するメソッドの使い方は、プレイヤーデータのクイックスタートでわかりやすく解説されているので、ここでは解説しません。
上記の記事から読み取りにくい部分にフォーカスして解説していこうと思います。
各種データの違い
プレイヤーデータは、「プレイヤー > プレイヤーデータ(タイトル)」で設定画面を表示することができます。
すると、「プレイヤーデータ」だけでなく、「読み取り専用データ」「内部データ」という設定も出てきます。
Client | Server | |
---|---|---|
プレイヤーデータ | CRUD | CRUD |
読み取り専用データ | R | CRUD |
内部データ | – | CRUD |
クライアントから処理する場合は、読み取り専用データは読み取りだけ、内部データは読み取りもできません。
一方でサーバー(CloudScript)で処理する場合は、すべてのデータで自由な操作ができるようになっています。
すべてプレイヤーデータとして管理することもできますが、クライアントから操作されたくない項目もあると思います。
そういったものは、読み取り専用データや内部データで管理することで、よりセキュリティレベルをあげることができますね。
アクセス許可とは
右側で選べる「アクセス許可」には、以下の2種類があります。
- プライベート
- パブリック
少しわかりにくいですが、「他の人からアクセスを許可するかどうか」の意味になります。
具体的にコードで見てみましょう。
void GetUserData()
{
PlayFabClientAPI.GetUserData(new GetUserDataRequest() {
PlayFabId = PlayFabId
}, result => {
Debug.Log(result.Data["Name"].Value);
}, error => {
Debug.Log(error.GenerateErrorReport());
});
}
上記はプレイヤーデータを取得するメソッドですが、引数で PlayFabId を渡していますね。
特に渡さなければ自分のIDとなるのですが、ここをあえて別の人のIDを渡すことも可能です。
別の人のIDを指定したときに、アクセス許可を public にしておけば、正常に取得できるというわけです。
ただしセキュリティ面が心配なので、基本は private としておき、必要に応じて読み取り専用データや内部データを public にするほうがよいでしょう。
応用編:Json 形式で保存する
ここまでは Key Value が「1対1」でしたが、「1対多」として保存することも可能です。
具体的には、Json 形式で保存してあげれば、「1対多」が可能になります。
例えば「Quests」というキーを用意してあげて、Json 形式でデータが保存されているとします。
Json 形式のデータを取得する場合は、自分で用意したクラスに Deserialize してあげれば、使いやすいのでおすすめです。
List<UserQuestData> UserQuestDatas { get; private set; }
void GetUserData()
{
PlayFabClientAPI.GetUserData(new GetUserDataRequest() {
}, result => {
UserQuestDatas = PlayFabSimpleJson.DeserializeObject<List<UserQuestDatas>>(result.Data["Quests"].Value);
}, error => {
Debug.Log(error.GenerateErrorReport());
});
}
[System.Serializable]
public class UserQuestData
{
public int Id;
public int Score;
}
取得ではなく更新したいときは、Serialize をしてあげることで、Json 形式で保存することができます。
var changes = new Dictionary<string, string>
{
{ "Quests", PlayFabSimpleJson.SerializeObject(UserQuestDatas) }
};
PlayFabClientAPI.UpdateUserData(new UpdateUserDataRequest
{
Data = changes
}, result =>
{
Debug.Log("Update UserQuest Success!!");
}, error =>
{
Debug.Log(error.GenerateErrorReport());
});
Json 形式の保存を使うことで、より多くのデータを保存できるようになるので、ぜひ試してみてください。
Json 形式で保存するようなデータは、RDB で管理するのが一般的だと思います。
しかし PlayFab ではそういった機能が用意されていないため、Key Value として Json 形式で保存する必要がある、というわけです。
最後に
プレイヤーデータとタイトルデータについて解説しました。
初めて PlayFab を触る人は、まずはここの理解から始めていきましょう。
すでに触ったことがある人も、Json 形式でのデータ保存は知らなかった人も多いのではないでしょうか?
できるだけ PlayFab 内でデータ管理を完結させて、実装量を減らしていきましょう。
PlayFab のことをもっと皆さんに知ってもらいたくて、合計500ページ以上にもなる書籍を5冊に分けて執筆しました。
私の知識をすべて詰め込んでいるので、ゲーム開発をさらに加速させたい方はぜひご覧ください。