PlayFab でインベントリのアイテムを取得して消費する方法を解説します。
「インベントリとは?」「カタログとは?」なども説明していると長くなるので、この記事では省略しますね。
この記事では、サーバー側で ConsumeItem 処理をしている箇所がありますが、クライアント側でも処理することが可能です。
サーバー側で処理をしなければいけない理由もないので、お好きな方で実装してください。
ということで、さっそく見ていきましょう。
インベントリのアイテムを取得して消費する
全体の流れは以下のとおりです。
- ユーザーインベントリを取得(クライアント側)
- サーバー処理の呼び出し(クライアント側)
- 取得したインベントリアイテムを消費(サーバー側)
一つずつ見ていきます。
クライアント側の実装
まずは、インベントリ情報を取得しましょう。
GetUserInventry を呼び出せばOKです。
private List<ItemInstance> userInventry;
private void GetUserInventry()
{
PlayFabClientAPI.GetUserInventory(new GetUserInventoryRequest
{
}, (result) =>
{
userInventry = result.Inventory;
Debug.Log("GetUserInventory Success!!");
}, (error) =>
{
Debug.Log(error.GenerateErrorReport());
});
}
取得したインベントリは、ItemInstance という型のリストで取ることができ、これを内部変数として保持しておきます。
ItemInstanceというのが、一つのアイテムのことですね。
アイテムを消費するには、「ItemInstance.ItemInstanceId」が必要になるので覚えておきましょう。
ItemInstance には「ItemId」と「ItemInstanceId」というプロパティがあり、少しややこしいですよね。
ということで、わかりやすい図で見てみましょう。
3人で同じアイテムを2つずつ持っていたとした場合のイメージです。
ItemId はシステム上で共通の ID のことで、ItemInstanceId は1つ1つに割り振られる ID のこと、と覚えておきましょう。
次に、クライアントからサーバーのアイテム消費メソッド(ConsumeItem)を呼び出す処理を書きます。
- ファンクション名は ConsumeItem
- パラメータ名は ItemId、値は userInventry[0].ItemInstanceId
Azure関数でCloudScriptを実行する方法を参考に、上記の内容で呼び出し処理を書いてみましょう。
クライアント側の準備はこれで完了です。
サーバー側の実装
次にサーバー側の実装です。
メソッド名は呼び出し側のパラメータと一致させるため、CousumeItem とする必要があります。
[FunctionName("ConsumeItem")]
public static async Task<dynamic> ConsumeItem(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
string body = await req.ReadAsStringAsync();
var context = JsonConvert.DeserializeObject<FunctionExecutionContext<dynamic>>(body);
var args = context.FunctionArgument;
// 引数の取り出し
dynamic itemId = null;
if (args != null && args["ItemId"] != null)
itemId = args["ItemId"];
// アイテム消費
var result = await ConsumeItemAsync(context, itemId);
// 結果の返却
return new { resultValue = result };
}
private static async Task<string> ConsumeItemAsync(FunctionExecutionContext<dynamic> context, dynamic itemId)
{
var serverApi = new PlayFabServerInstanceAPI(context.ApiSettings, context.AuthenticationContext);
var result = await serverApi.ConsumeItemAsync(new PlayFab.ServerModels.ConsumeItemRequest()
{
PlayFabId = context.CallerEntityProfile.Lineage.MasterPlayerAccountId,
ItemInstanceId = itemId,
ConsumeCount = 1
});
return result.Result.ItemInstanceId;
}
全体的な処理については、「Azure関数を使用したcontextモデルを理解する」で解説しているので、ここでは割愛します。
ConsumeItemAsyncにフォーカスして説明していきますね。
var result = await serverAPI.ConsumeItemAsync(new PlayFab.ServerModels.ConsumeItemRequest()
{
PlayFabId = context.CallerEntityProfile.Lineage.MasterPlayerAccountId,
ItemInstanceId = itemId,
ConsumeCount = 1
});
引数は以下の通りです。
CharacterId | キャラクターのインベントリから消費する場合は指定する。 |
---|---|
ConsumeCount | 消費したいアイテムの数。 |
ItemInstanceId | アイテム固有のIDを指定する。 |
PlayFabId | MasterPlayerAccountIdを指定する。 |
今回キャラクターは使用しないので、指定していません。(キャラクターについては、また別の記事で解説します)
消費したいアイテムの数は、今回は「1固定」としていますが、クライアントから引数で渡すことで動的に変えることも可能です。
これで実行すると、無事にインベントリから対象のアイテムを消費することができます。
アイテムが消費されたことの確認
PlayFabの画面から確認できます。
まずは、「プレイヤー ⇒ インベントリ」の順で進みましょう。
下の方の「期限切れ/失効済み/スタック済みを非表示にする」を選択すると、消費されたアイテムを確認することができます。
おまけ:複数アイテムを消費する方法
最後に、複数アイテムを消費する方法を解説します。
流れとしては1つの場合とそこまで変わりません。
- パラメータ名は ItemInstances、値は ItemInstanceId のリストを渡す
- サーバー側でリストの分だけループする
これだけです。
サーバー側だけサンプルを書いておきますね。
private static async Task<List<string>> ConsumeItemAsync(FunctionExecutionContext<dynamic> context, dynamic itemInstances)
{
var serverApi = new PlayFabServerInstanceAPI(context.ApiSettings, context.AuthenticationContext);
var itemIds = new List<string>();
foreach (var itemId in itemInstances)
{
var result = await serverApi.ConsumeItemAsync(new PlayFab.ServerModels.ConsumeItemRequest()
{
PlayFabId = context.CallerEntityProfile.Lineage.MasterPlayerAccountId,
ItemInstanceId = itemId,
ConsumeCount = 1
});
itemIds.Add(result.Result.ItemInstanceId);
}
return itemIds;
}
返り値は、消費したアイテムの ItemInstanceId リストにしてみました。
複数アイテムの消費についても試してみてください。
最後に
インベントリのアイテムを取得して消費する方法について解説しました。
このあたりの処理を独自に組むとなるとかなり大変なので、PlayFab には本当に感謝です。
どのゲームにもアイテムは必ず出てくるはずなので、この記事を参考に実装を進めてみてください。
PlayFab のことをもっと皆さんに知ってもらいたくて、合計500ページ以上にもなる書籍を5冊に分けて執筆しました。
私の知識をすべて詰め込んでいるので、ゲーム開発をさらに加速させたい方はぜひご覧ください。