この記事でのバージョン
Unity 2018.4.8f1
PlayFab SDK 2.77.191029
はじめに
今回はUnityでPlayFabのプレーヤーデータを使ってみようという感じの記事です!
ちなみに、PlayFabとはなんぞや?という方は以下の記事を参照の事。
ざっくり言うとサーバーサイドが関わる事を楽して実装出来るサービスです。
しかも、無料で始める事も可能ですし、有料プランでも1000MAUまでは無料と
「ユーザが全然増えないのにお金だけ払う」みたいな事がありません。
なので個人開発でも使い始めやすいですし、Microsoftのサービスという安心感まであります。
Indie Plan、1,000 MAU まで無料だし、それを超えて有料になっても 100,000 MAU までは月額 $99 というお手頃価格なので個人や小規模なチームの開発にとても良いと思います🙂
— 南@エンジニア兼ティーアドバイザー (@_y_minami) 2019年11月14日
カジュアルなゲームなら機能制限がある代わりに MAU が何人でも完全無料の Essentials Plan でも良し☺️ https://t.co/TzPHB2g3ZR
なお、本記事は以下の導入やログイン処理が済んでいる前提になりますので、あしからず。
プレーヤーデータとは
そもそもPlayFabにおけるプレーヤーデータとは各ユーザ(プレーヤー)ごとのデータの事で、
例えば「ユーザの名前」や「クリアしたステージ」のように各ユーザで異なる値の物に使います。
ちなみに、「敵の能力値」や「ステージの累計数」のような
どのユーザでも同じ値の物はタイトルデータと言い、これもPlayFabで扱えます。
さらにランキングやゲーム内通貨を扱う機能等もあるようなので、これもいずれ記事にする予定です。
ブラウザ上からプレーヤーデータの確認や変更
プレーヤーデータの確認や変更はブラウザ上からも行えるでの、先にそちらから紹介していきます。
なお、Window/PlayFab/Editor Extensionsで開けるウィンドウの右上にある
GAME MANAGERをクリックすると、設定用のページを開けます。
確認及び変更箇所は「ビルド/プレイヤー」のページ内上部にある「プレイヤー」です。
ここで任意のプレイヤーを選ぶと、そのプレイヤーのデータを確認や変更が出来ます。
なお、プレイヤーデータ(タイトル)がそのゲームだけで使えるもので、
プレイヤーデータ(パブリッシャー)が自分が作った全ゲーム共通で使えるものです。
変更方法は簡単、「キー」と「値」及び「アクセス許可」を設定した後、
「プレイヤーデータの保存」を押すだけです。
ちなみにアクセス許可はプライベートだとそのプレイヤー本人だけが参照でき、
パブリックだと他のプレイヤーからも参照出来るようになります。
また、読み取り専用データはクライアントからは読み取りのみで変更はできないデータで、
内部データはクライアントから読み取りも出来ないデータになります。
プログラムからプレーヤーデータの取得
次に設定したプログラムからプレーヤーデータを取得する方法ですが、
まず、以前の記事で紹介したような感じでログイン処理を先に行います。
そしてその後、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上でも取得出来る値が変わっているのが分かると思います。
ちなみに、プレイヤーデータ(パブリッシャー)に設定されてるものは
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()}"); } }
実際に使ってみると以下のような感じで、
更新実行後、ブラウザ上でも値が変わっているのが分かると思います。
ちなみに、プレイヤーデータ(パブリッシャー)に設定されてあるものは
PlayFabClientAPI.UpdateUserPublisherDataで更新します。
おわりに
前回のタイトルデータに引き続き、
プレーヤーデータもびっくりするほど簡単に実装が行えました。
プレーヤーデータが使えれば出来る事もかなり増えるので、
これだけでPlayFabを使う理由になり得ると思います。
なお、前述したように他にも様々な機能があるので、これからも試して記事にしていきたいと思います。
参考