(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]



Unity+PlayFabでプレーヤーデータ(各ユーザごとのデータ)を設定&取得【Unity】【PlayFab】


このエントリーをはてなブックマークに追加



この記事でのバージョン
Unity 2018.4.8f1
PlayFab SDK 2.77.191029


はじめに

今回はUnityでPlayFabのプレーヤーデータを使ってみようという感じの記事です!


ちなみに、PlayFabとはなんぞや?という方は以下の記事を参照の事。

ざっくり言うとサーバーサイドが関わる事を楽して実装出来るサービスです。



しかも、無料で始める事も可能ですし、有料プランでも1000MAUまでは無料

「ユーザが全然増えないのにお金だけ払う」みたいな事がありません。

なので個人開発でも使い始めやすいですし、Microsoftのサービスという安心感まであります。



なお、本記事は以下の導入やログイン処理が済んでいる前提になりますので、あしからず。





プレーヤーデータとは

そもそもPlayFabにおけるプレーヤーデータとは各ユーザ(プレーヤー)ごとのデータの事で、

例えば「ユーザの名前」や「クリアしたステージ」のように各ユーザで異なる値の物に使います。


ちなみに、「敵の能力値」や「ステージの累計数」のような

どのユーザでも同じ値の物はタイトルデータと言い、これもPlayFabで扱えます。



さらにランキングやゲーム内通貨を扱う機能等もあるようなので、これもいずれ記事にする予定です。


ブラウザ上からプレーヤーデータの確認や変更

プレーヤーデータの確認や変更はブラウザ上からも行えるでの、先にそちらから紹介していきます。

なお、Window/PlayFab/Editor Extensionsで開けるウィンドウの右上にある

GAME MANAGERをクリックすると、設定用のページを開けます。

f:id:kan_kikuchi:20200105044438j:plain
f:id:kan_kikuchi:20200105044447j:plain


確認及び変更箇所は「ビルド/プレイヤー」のページ内上部にある「プレイヤー」です。

ここで任意のプレイヤーを選ぶと、そのプレイヤーのデータを確認や変更が出来ます。

f:id:kan_kikuchi:20200113063149j:plain


なお、プレイヤーデータ(タイトル)がそのゲームだけで使えるもので、

プレイヤーデータ(パブリッシャー)が自分が作った全ゲーム共通で使えるものです。

f:id:kan_kikuchi:20200113063549j:plain


変更方法は簡単、「キー」「値」及び「アクセス許可」を設定した後、

「プレイヤーデータの保存」を押すだけです。

f:id:kan_kikuchi:20200113063704j:plain


ちなみにアクセス許可はプライベートだとそのプレイヤー本人だけが参照でき

パブリックだと他のプレイヤーからも参照出来るようになります。

f:id:kan_kikuchi:20200113063714j:plain


また、読み取り専用データはクライアントからは読み取りのみで変更はできないデータで、

内部データはクライアントから読み取りも出来ないデータになります。

f:id:kan_kikuchi:20200113063725j:plain



プログラムからプレーヤーデータの取得

次に設定したプログラムからプレーヤーデータを取得する方法ですが、

まず、以前の記事で紹介したような感じでログイン処理を先に行います。



そしてその後、GetUserDataRequestのインスタンスを生成し、

PlayFabClientAPI.GetUserDataにそれプラス、成功時と失敗時のデリゲートを渡すだけ。


なお、プログラム上ではプレーヤーデータではなくユーザデータ(UserData)と呼ばれています。

using System;
using System.Collections.Generic;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// ユーザー(プレイヤー)データを取得するサンプル
/// </summary>
public class UserDataSample : MonoBehaviour {

  [SerializeField]
  private Text _text = default;

  //=================================================================================
  //取得
  //=================================================================================

  /// <summary>
  /// ユーザー(プレイヤー)データの取得
  /// </summary>
  public void GetUserData() {
    //GetUserDataRequestのインスタンスを生成
    var request = new GetUserDataRequest();

    //ユーザー(プレイヤー)データの取得
    PlayFabClientAPI.GetUserData(request, OnSuccessGettingPlayerData, OnErrorGettingPlayerData);
    Debug.Log($"プレイヤー(ユーザー)データの取得開始");
  }
  
  //=================================================================================
  //取得結果
  //=================================================================================

  //ユーザー(プレイヤー)データの取得に成功
  private void OnSuccessGettingPlayerData(GetUserDataResult result) {
    Debug.Log($"ユーザー(プレイヤー)データの取得に成功しました");

    //result.Data(Dictionary<string, UserDataRecord>)に全データが入っていて、Keyを文字列で指定すると値が取り出せる
    _text.text = result.Data["Key"].Value;
  }

  //ユーザー(プレイヤー)データの取得に失敗
  private void OnErrorGettingPlayerData(PlayFabError error) {
    Debug.LogWarning($"ユーザー(プレイヤー)データの取得に失敗しました : {error.GenerateErrorReport()}");
  }
  
}


実際に使ってみると以下のような感じで、

ブラウザ上で値を変えると、Unity上でも取得出来る値が変わっているのが分かると思います。

f:id:kan_kikuchi:20200113081321g:plain


ちなみに、プレイヤーデータ(パブリッシャー)に設定されてるものは

PlayFabClientAPI.GetUserPublisherDataで取得し、

読み取り専用データはPlayFabClientAPI.GetUserReadOnlyData

PlayFabClientAPI.GetUserPublisherReadOnlyDataで取得します。


プログラムからプレーヤーデータの更新

最後にプログラムからプレーヤーデータの更新する方法ですが、

取得と同様にログイン処理を先に行います。


そしてその後、UpdateUserDataRequestのインスタンスを生成し、

PlayFabClientAPI.UpdateUserData にそれプラス、

更新や新規追加したいデータ削除したいデータアクセス許可の設定

成功時と失敗時のデリゲートを渡すだけ。

なお、DictionaryとListはどちらかだけでも問題ありませんし、アクセス許可は省略可能です。

using System;
using System.Collections.Generic;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// ユーザー(プレイヤー)データを取得するサンプル
/// </summary>
public class UserDataSample : MonoBehaviour {

  [SerializeField]
  private Text _text = default;

  //=================================================================================
  //更新
  //=================================================================================

  /// <summary>
  /// ユーザー(プレイヤー)データの更新
  /// </summary>
  public void UpdateUserData() {
    //更新するデータ
    var updateDataDict = new Dictionary<string, string>() {
      {"Name",   "Kan"},
      {"LV",     "58"},
      {"SageNo", "39"},
    };
    
    //削除するキー
    List<string> removeKeyList = new List<string>() {
      "Key"
    };
    
    //UpdateUserDataRequestのインスタンスを生成
    var request = new UpdateUserDataRequest {
      Data         = updateDataDict, 
      KeysToRemove = removeKeyList, 
      Permission   = UserDataPermission.Private //アクセス許可設定
    };
    
    //ユーザー(プレイヤー)データの更新
    PlayFabClientAPI.UpdateUserData(request, OnSuccessUpdatingPlayerData, OnErrorUpdatingPlayerData);
    Debug.Log($"プレイヤー(ユーザー)データの更新開始");
  }
  
  //=================================================================================
  //更新結果
  //=================================================================================

  //ユーザー(プレイヤー)データの更新に成功
  private void OnSuccessUpdatingPlayerData(UpdateUserDataResult result) {
    Debug.Log($"ユーザー(プレイヤー)データの更新に成功しました");
    
    //result.ToJsonでjsonで形式で結果を確認可能(result.Dataはない)
    _text.text = $"{result.ToJson()}";
  }

  //ユーザー(プレイヤー)データの更新に失敗
  private void OnErrorUpdatingPlayerData(PlayFabError error) {
    Debug.LogWarning($"ユーザー(プレイヤー)データの更新に失敗しました : {error.GenerateErrorReport()}");
  }
  
}


実際に使ってみると以下のような感じで、

更新実行後、ブラウザ上でも値が変わっているのが分かると思います。

f:id:kan_kikuchi:20200113083513g:plain


ちなみに、プレイヤーデータ(パブリッシャー)に設定されてあるものは

PlayFabClientAPI.UpdateUserPublisherDataで更新します。


おわりに

前回のタイトルデータに引き続き、

プレーヤーデータもびっくりするほど簡単に実装が行えました。


プレーヤーデータが使えれば出来る事もかなり増えるので、

これだけでPlayFabを使う理由になり得ると思います。

なお、前述したように他にも様々な機能があるので、これからも試して記事にしていきたいと思います。


参考