(:3[kanのメモ帳]

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

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


Unity+PlayFabでカタログの作成とインベントリにアイテムを配布&消費【Unity】【PlayFab】


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


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


はじめに

今回はUnityでPlayFabのカタログやインベントリを使ってみようという感じの記事です!


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

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



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

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

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



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





カタログ、インベントリとは

そもそもPlayFabにおけるカタログとはゲーム内のアイテム一覧表みたいなものです。

カタログとは何ですか?

多くのゲームでは、シールド、レベルロック解除、電源投入など、購入用のプレーヤーの項目を提供しています。 これらの項目は、仮想通貨または実際の金額の単位でカタログで指定されます。 カタログは、ゲームの仮想項目を管理するための簡単な方法を提供します。 これは、ゲームで利用できるすべての項目の一覧です。


そしてインベントリとは各ユーザが持っているアイテムを入れておく場所みたいなものです。





カタログやアイテムの作成

カタログやアイテムの作成はブラウザ上で行います。

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

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

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


作成箇所は左側にある「参加/エコノミー」にある「新しいカタログ」です。

f:id:kan_kikuchi:20200123051040j:plain


適当なカタログのバージョン(カタログの名前)を付けて保存すると、

f:id:kan_kikuchi:20200123051507j:plain


カタログ一覧に作成されます。

f:id:kan_kikuchi:20200123051516j:plain


ちなみにカタログのバージョンを日本語にすると

「developer.playfab.com ページが見つかりません」というエラーが出るみたいです。

f:id:kan_kikuchi:20200123051531j:plain
f:id:kan_kikuchi:20200123051542j:plain


作成したカタログをクリックすると、

f:id:kan_kikuchi:20200123051649j:plain


新しいアイテムの作成が出来ます。

f:id:kan_kikuchi:20200123052031j:plain


色々設定項目がありますが、最低限アイテムIDだけを設定すれば保存が可能です。

ちなみに、設定は後からでも変更可能です。

f:id:kan_kikuchi:20200123052044j:plain


なお、作成したアイテムは各カタログのページから一覧で見ることもできます。

f:id:kan_kikuchi:20200123052136j:plain



アイテムの配布

特定のユーザにアイテムを配布したい場合は、

プレイヤーから対象のIDを選択し、

f:id:kan_kikuchi:20200125105517j:plain


「インベントリ」から「アイテムを付与」を行います。

f:id:kan_kikuchi:20200125105601j:plain
f:id:kan_kikuchi:20200125105615j:plain


全員または特定の人達に配布したい場合は、

「ビルド/自動化」にある「新しいスケジュール済みタスク」から、

f:id:kan_kikuchi:20200125110656j:plain


以下のように配布対象や配布するアイテムを選択し、「保存して実行」を行います。

f:id:kan_kikuchi:20200125110716j:plain
f:id:kan_kikuchi:20200125110742j:plain



アイテムの取得

ユーザが自分のインベントリにあるアイテムを取得したい場合

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



そしてその後、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上でも取得出来るのが分かると思います。

f:id:kan_kikuchi:20200126111756j:plain



アイテムの消費

ブラウザ上から「取り消す」を実行する事で、各ユーザのアイテムを無くす事が可能ですが、

f:id:kan_kikuchi:20200126115150j:plain


消費型のアイテムは各ユーザから消費する事も可能です。

f:id:kan_kikuchi:20200126110731j:plain


消費の方法は、取得と同様にログイン処理を先に行った後、

消費したいアイテムのインスタンス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上で消費したアイテムがブラウザ上でも無くなっているのが分かると思います。

f:id:kan_kikuchi:20200126112716g:plain


なお、アイテムのインスタンスIDはブラウザ上で確認出来ますし、

上記の取得の時にログで表示したitem.ItemInstanceIdでも確認可能です。

f:id:kan_kikuchi:20200126111814j:plain



おわりに

アイテムの管理はPlayFab(というかサーバ)を使わずとも可能ですが、

PlayFabを使えばデータの改ざんが難しくなるので、アイテムを増やすといったチートも難しくなります。


また、好きなタイミングで特定のユーザにアイテムを配るという事も出来ますし、

「どのアイテムがどれぐらい持たれているか、使われているか」みたいな分析もしやすくなるので、

しっかりアイテム周りを管理したい場合、例えば運営型のゲームなどにはオススメの機能でした。


参考