10
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

UnityからPlayFabのユーザーデータをCRUDする

今回は Unity から PlayFab のユーザーデータを CRUD してみます。
※PlayFabとは?という方は こちら をご覧ください。

まえがき

1. ユーザーデータとは

スマホアプリの RPG を想像してみてください。
以下のようなデータがユーザーに紐付いていますよね。

  • プレイヤー名
  • レベル
  • 経験値
  • ジョブ
  • デッキ

こうしたデータをユーザーデータとして PlayFab の KVS で管理します。

2. ユーザーデータの例外について

よくゲームをプレイされる方は先程の例を見て、インベントリや魔法石とかは対象じゃないの? と思われたかもしれません。

PlayFab はユーザーデータ以外にもデータを管理する機能が複数存在します。
例えば下記のデータについてはそれぞれ専用の管理機能が提供されているのでそちらを使用します。

  • キャラクター
  • インベントリ
  • 通貨
  • フレンド
  • ファイル

この記事ではこれらの管理はスコープ外とします。

3. ユーザーデータとプレイヤーデータとキャラクターデータ

PlayFab は ユーザーデータプレイヤーデータ と表記することもあります。
実際に GameManager(PlayFabのWebの管理画面)と API や SDK では違う名前が使われています。

  • GameManager -> PlayerData
  • APIやSDK -> UserData

この2つは同じものを示していますので慣れるまで注意してください。

また、 キャラクターデータ という言葉が出てきた場合はユーザーが保持している キャラクターのデータ を示しています。
これはユーザーデータとは別物ですのでこちらも注意してください。

ここまでが前書きです。長くてすいません。

ユーザーデータを Unity から CRUD する

1. 下準備(Unity から PlayFab SDK を使う準備と PlayFab へのログインの実装)

@ume67026265 さんが PlayFab のアカウントの作り方と、Unity へ SDK を導入する記事を書かれています。
不慣れな方はこちらを参考に進めるとスムーズに準備ができると思います。

2. Create

準備が終わったらユーザーデータを Create しましょう。
と言いたいところですが、実は 1. の下準備の中でユーザーがログインした時点でユーザーデータは PlayFab 上に自動的に Create されています。

GameManager でユーザーデータが作成されたことを確認しましょう。

左メニューの「プレイヤー」を開くと、先程ログインしたプレイヤーの情報が表示されるので ID の部分をクリックします。

image.png

プレイヤーデータ(タイトル)を開きます。
image.png

中身は空ですが、ユーザーデータが作成されていることが確認できました。
次は Read を試したいので、適当な Name を登録しておきましょう。

image.png

3. Read

先程登録した Name を取得して Unity で表示してみましょう。

下準備で作った PlayFabLogin という Script を編集します。
ログインに成功したらユーザーデータを取得して名前を表示するようにしてみます。

3.1 PlayFabLogin クラスに以下のメソッドを追加

    public static void GetUserData()
    {
        var request = new GetUserDataRequest();
        PlayFabClientAPI.GetUserData(request, OnSuccess, OnError);

        void OnSuccess(GetUserDataResult result)
        {
            Debug.Log("GetUserData: Success!");
            Debug.Log($"My name is {result.Data["Name"].Value}");
        }

        void OnError(PlayFabError error)
        {
            Debug.Log("GetUserData: Fail...");
            Debug.Log(error.GenerateErrorReport());
        }
    }

3.2 OnLoginSuccess メソッドの中で GetUserData を呼び出す

    private void OnLoginSuccess(LoginResult result)
    {
        Debug.Log("Congratulations, you made your first successful API call!");

        GetUserData(); // ここを追加
    }

これで Unity を再生してみましょう。
image.png
名前が表示できました。

4. Update

次は Name を変更してみましょう。
先程と同じ要領で Update のメソッドを追加します。

4.1 PlayFabLogin クラスに以下のメソッドを追加

    public static void UpdateUserData()
    {
        var request = new UpdateUserDataRequest()
        {
            Data = new Dictionary<string, string>
            {
                { "Name", "Kita" }
            }
        };

        PlayFabClientAPI.UpdateUserData(request, OnSuccess, OnError);

        void OnSuccess(UpdateUserDataResult result)
        {
            Debug.Log("UpdateUserData: Success!");
            GetUserData();
        }

        void OnError(PlayFabError error)
        {
            Debug.Log("UpdateUserData: Fail...");
            Debug.Log(error.GenerateErrorReport());
        }
    }

4.2 OnLoginSuccess メソッドの中で UpdateUserData を呼び出す

    private void OnLoginSuccess(LoginResult result)
    {
        Debug.Log("Congratulations, you made your first successful API call!");

        GetUserData();

        UpdateUserData(); // ここを追加
    }

これで Unity を再生してみましょう。
image.png
名前が変わりました。

ちなみに新しい Key を追加する場合は Data の Dictionary をそのようにしてあげれば動きます。

    Data = new Dictionary<string, string>
    {
        { "Name", "Minami" },
        { "Job", "TeaAdvisor" }  // Job を新しく追加してみる
    }

Job が追加されました。
image.png

なお Key を削除する場合は Value を null にします。

    Data = new Dictionary<string, string>
    {
        { "Name", "Minami" },
        { "Job", null}  // Job はなかったことに
    }

Job が消えましたね。
image.png

5. Delete

CRUD するというタイトルにしたものの、ユーザーデータをまるごと削除する操作はありませんでした。

Update の項目に書いた方法ですべての Key を削除するか、ユーザーそのものを削除するしか方法は無いようです。

ユーザーデータを良い感じに初期化してくれるファンクションでも作っておくと捗るかもしれないですね。

あとがき

一度試してみたら簡単に使える感じだと思いますので、興味がある方は是非試してみてください。

ちなみにユーザーデータは下記の3種類が存在します。
- UserData(Clientから読み書き可能なもの)
- UserReadOnlyData(Clientからは読み取りしかできないもの)
- UserInternalData(Clientからは読み書きできないもの)

チートされたりしないように適切なものを使いましょう。

参考/関連

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
10
Help us understand the problem. What are the problem?