この記事でのバージョン
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におけるカタログとはゲーム内のアイテム一覧表みたいなものです。
カタログとは何ですか?
多くのゲームでは、シールド、レベルロック解除、電源投入など、購入用のプレーヤーの項目を提供しています。 これらの項目は、仮想通貨または実際の金額の単位でカタログで指定されます。 カタログは、ゲームの仮想項目を管理するための簡単な方法を提供します。 これは、ゲームで利用できるすべての項目の一覧です。
そしてインベントリとは各ユーザが持っているアイテムを入れておく場所みたいなものです。
カタログやアイテムの作成
カタログやアイテムの作成はブラウザ上で行います。
なお、Window/PlayFab/Editor Extensionsで開けるウィンドウの右上にある
GAME MANAGERをクリックすると、設定用のページを開けます。
作成箇所は左側にある「参加/エコノミー」にある「新しいカタログ」です。
適当なカタログのバージョン(カタログの名前)を付けて保存すると、
カタログ一覧に作成されます。
ちなみにカタログのバージョンを日本語にすると
「developer.playfab.com ページが見つかりません」というエラーが出るみたいです。
作成したカタログをクリックすると、
新しいアイテムの作成が出来ます。
色々設定項目がありますが、最低限アイテムIDだけを設定すれば保存が可能です。
ちなみに、設定は後からでも変更可能です。
なお、作成したアイテムは各カタログのページから一覧で見ることもできます。
アイテムの配布
特定のユーザにアイテムを配布したい場合は、
プレイヤーから対象のIDを選択し、
「インベントリ」から「アイテムを付与」を行います。
全員または特定の人達に配布したい場合は、
「ビルド/自動化」にある「新しいスケジュール済みタスク」から、
以下のように配布対象や配布するアイテムを選択し、「保存して実行」を行います。
アイテムの取得
ユーザが自分のインベントリにあるアイテムを取得したい場合は
まず、以前の記事で紹介したような感じでログイン処理を先に行います。
そしてその後、GetUserInventoryRequestのインスタンスを生成し、
PlayFabClientAPI.GetUserInventoryにそれプラス、成功時と失敗時のデリゲートを渡すだけ。
using PlayFab; using PlayFab.ClientModels; using UnityEngine; /// <summary> /// インベントリのサンプル /// </summary> public class InventorySample : MonoBehaviour { //================================================================================= //取得 //================================================================================= /// <summary> /// インベントリの情報を取得 /// </summary> public void GetUserInventory(){ //GetUserInventoryRequestのインスタンスを生成 var userInventoryRequest = new GetUserInventoryRequest(); //インベントリの情報の取得 Debug.Log($"インベントリの情報の取得開始"); PlayFabClientAPI.GetUserInventory(userInventoryRequest, OnSuccess, OnError); } //================================================================================= //取得結果 //================================================================================= //インベントリの情報の取得に成功 private void OnSuccess(GetUserInventoryResult result){ //result.Inventoryがインベントリの情報 Debug.Log($"インベントリの情報の取得に成功 : インベントリに入ってるアイテム数 {result.Inventory.Count}個"); //インベントリに入ってる各アイテムの情報をログで表示 foreach(ItemInstance item in result.Inventory){ Debug.Log($"ID : {item.ItemId}, Name : {item.DisplayName}, ItemInstanceId : {item.ItemInstanceId}"); } } //インベントリの情報の取得に失敗 private void OnError(PlayFabError error){ Debug.LogError($"インベントリの情報の取得に失敗\n{error.GenerateErrorReport()}"); } }
実際に使ってみると以下のような感じで、
ブラウザ上で確認出来る値と同じ物が、Unity上でも取得出来るのが分かると思います。
アイテムの消費
ブラウザ上から「取り消す」を実行する事で、各ユーザのアイテムを無くす事が可能ですが、
消費型のアイテムは各ユーザから消費する事も可能です。
消費の方法は、取得と同様にログイン処理を先に行った後、
消費したいアイテムのインスタンスIDを渡したConsumeItemRequestのインスタンスを生成し、
PlayFabClientAPI.ConsumeItemにそれプラス、成功時と失敗時のデリゲートを渡すだけ。
using PlayFab; using PlayFab.ClientModels; using UnityEngine; /// <summary> /// インベントリのサンプル /// </summary> public class InventorySample : MonoBehaviour { //================================================================================= //消費 //================================================================================= /// <summary> /// インベントリのアイテムを消費 /// </summary> public void ConsumeItem(){ //ConsumeItemRequestのインスタンスを生成 var consumeItemRequest = new ConsumeItemRequest{ ItemInstanceId = "77761CE0432DFCA0", //消費したいアイテムのインスタンスID ConsumeCount = 1 //消費数 }; //インベントリのアイテムを消費 Debug.Log($"インベントリのアイテムを消費開始"); PlayFabClientAPI.ConsumeItem(consumeItemRequest, OnSuccess, OnError); } //================================================================================= //消費結果 //================================================================================= //インベントリのアイテムの消費に成功 private void OnSuccess(ConsumeItemResult result){ Debug.Log($"インベントリのアイテム({result.ItemInstanceId})の消費に成功"); } //インベントリのアイテムの消費に失敗 private void OnError(PlayFabError error){ Debug.LogError($"インベントリのアイテムの消費に失敗\n{error.GenerateErrorReport()}"); } }
実際に使ってみると以下のような感じで、
Unity上で消費したアイテムがブラウザ上でも無くなっているのが分かると思います。
なお、アイテムのインスタンスIDはブラウザ上で確認出来ますし、
上記の取得の時にログで表示したitem.ItemInstanceIdでも確認可能です。
おわりに
アイテムの管理はPlayFab(というかサーバ)を使わずとも可能ですが、
PlayFabを使えばデータの改ざんが難しくなるので、アイテムを増やすといったチートも難しくなります。
また、好きなタイミングで特定のユーザにアイテムを配るという事も出来ますし、
「どのアイテムがどれぐらい持たれているか、使われているか」みたいな分析もしやすくなるので、
しっかりアイテム周りを管理したい場合、例えば運営型のゲームなどにはオススメの機能でした。
参考