
Azure PlayFabを使ってみましょう
-
2021年8月18日
こんにちは、cocone tech blog編集長のYです!
今回はゲーム開発に必要なバックエンドの機能を1から開発する必要がなくなるという夢のようなサービスをクライアントエンジニアのHさんにご紹介いただきました!
Azure PlayFabとは?
Azure PlayFabはMicrosoftのゲームに特化したBaaS(Backend As A Service)です。
公式サイトはこちら
https://azure.microsoft.com/ja-jp/services/playfab/
今回はPlayFab Unity3D SDKを用いてログイン機能とガチャ機能を実装していきます。
準備編
PlayFabをUnityプロジェクトに導入するには、Unityプロジェクトに専用のSDKの導入、PlayFabのアカウント登録、PlayFabへゲームタイトルの登録が必要です。
具体的な設定方法は本記事では省略いたします。
代わりにこちらの公式ドキュメントをご覧ください。
https://docs.microsoft.com/ja-jp/gaming/playfab/sdks/unity3d/quickstart
設定終了後PlayFabのゲームマネージャー側とUnity側のPlayFab Editorで対応ゲームタイトルの情報を確認することができます。
ゲームマネージャーインターフェース側
Unity PlayFab Editor側
ログイン編
PlayFabには、一般的なソーシャルゲームの基本機能を実装するためのAPIがたくさん用意されています。
例えばログイン機能について、クライアント側で直接使用できる”LoginWithCustomID”というAPIがあります。
以下のソースコードはゲームにログインするためのクライアント側のサンプルコードです。今回の例ではクライアント端末のデバイス識別子である”SystemInfo.deviceUniqueIdentifier”をユーザーIDとしています。
リクエスト引数の”CreateAccount”は”true”になってるため、まだアカウントが作成されていない場合、直接デバイス識別子をユーザーIDとして新規アカウントを作成します。
また、”result =>{}”と”fail => {}”にそれぞれ処理を記述することで、ログイン成功時と失敗時それぞれの動作を定義することができます。
- PlayFabClientAPI.LoginWithCustomID(
- new LoginWithCustomIDRequest
- {
- CustomId = SystemInfo.deviceUniqueIdentifier,
- CreateAccount = true
- },
- result =>
- {
- Debug.Log(
- “Successfully logged into game! Here is the token: “
- + result.EntityToken.EntityToken
- + “And here is your ID: “ + result.PlayFabId
- );
- },
- fail =>
- {
- Debug.Log(“login fail. HttpCode is :” + fail.HttpCode);
- }
- );
ログインのクライアント側実装
また、ゲームマネージャーインターフェイスでは全てのプレイヤー情報を確認できます。プレイヤーがログインに成功すると、ゲームマネージャー側で該当プレイヤーの最新のログイン時刻を確認することができます。
Playfabゲームマネージャー側のユーザー一覧
アイテム登録
続いてアイテム登録について説明します。
PlayFabではカタログという物を作成し、アイテムを登録します。
“多くのゲームでは、シールド、レベルの解放、パワーアップなどのアイテムをプレイヤーが購入できるようにしています。 これらのアイテムはカタログで、仮想通貨または実際のお金の単位が指定されています。 カタログは、ゲームの仮想アイテムを管理する簡単な方法です。 カタログは、ゲームで利用可能なすべてのアイテムのリストです。
ただし、プレイヤーがカタログからアイテムを購入できるようにするには、まずそのカタログに入れるアイテムを作成する必要があります。”
アイテムを含むカタログの作成は、ゲームマネージャーインターフェイスで行います。
カタログ作成手順についてはこちらの公式ドキュメントをご覧ください。
https://docs.microsoft.com/ja-jp/gaming/playfab/features/commerce/items/quickstart
カタログを作成し、アイテムの登録をするとゲームマネージャーインターフェイスに以下のように表示されます。
PlayFabゲーム マネージャー側で表示されたアイテムカタログ
アイテムカタログに登録されたアイテム
ドロップテーブルの設定
次に先ほど作成した”stoneTest2″というアイテムカタログについてガチャの実装を行なっていきます。
PlayFabのドロップテーブルを使うことで、「20%の確率でアイテムをドロップする」という処理を簡単に実装できます。
PlayFabのゲームマネージャーインターフェイスの、対応アイテムカタログの管理画面を開き、”Drop tables”タグで設定します。
こちらはアイテムカタログ”stoneTest2″のドロップテーブルの設定例です。設定された5つのアイテムのドロップ率(“Odds”)は全て20%となっています。
設定されたドロップテーブル
CloudScriptの作成
続いてCloudScriptの作成を行います。
“CloudScript は、高速で、安全で、スケーラブルな、専用サーバーの代替品です。 カスタム JavaScript は PlayFab マシンに直接存在し、実行されます。
ここから、コードをゲーム クライアントによって直接呼び出すか、PlayStream アクションを通じて間接的に呼び出すことができます。 さらに、CloudScript メソッドは PlayFab のサーバー API セットに完全にアクセスできます。”
一言でまとめるとCloudScriptは開発者がサーバーメソッドを自由に定義するためのものです。
以下はガチャのCloudScriptコードです。
CloudScriptでサーバーメソッドの”EvaluateRandomResultTable”を使い、ドロップ結果を取得します。
引数の”TableId”は設定されたドロップテーブルのidを指定します。
取得したドロップ結果に応じて”server.GrantItemsToUser”を使い、プレイヤーに該当アイテムを付与します。
- handlers.Gacha = function (args, context) {
- var request = {
- “CatalogVersion” : args.CatalogVersion,
- “TableId” : args.tableName
- };
- var Result = server.EvaluateRandomResultTable(request);
- let itemIds = [ ];
- itemIds.push(Result.ResultItemId);
- var granRequest = {
- “PlayFabId” : currentPlayerId,
- “CatalogVersion” : args.CatalogVersion,
- “ItemIds” : itemIds
- };
- var grantResult = server.GrantItemsToUser(grantRequest);
- return { messageValue: grantResult[“ItemGrantResults”] };
- }
CloudScript側( サーバー側)
ガチャの実行
最後にクライアント側でCloudScriptを呼び出し、ガチャを実行してみましょう。
こちらがクライアント側のコードになります。
- PlayFabClientAPI.ExecuteCloudScript(
- new ExecuteCloudScriptRequest()
- {
- FunctionName = “Gacha”, // Arbitrary function name (must exist in your uploaded cloud.js file)
- FunctionParameter = new {
- CatalogVersion = “stoneTest2”,
- tableName = “TestGotcha”
- }, // The parameter provided to your function
- GeneratePlayStreamEvent = true, // Optional – Shows this event in PlayStream
- },
- (ExecuteCloudScriptRequest result) =>
- {
- PlayFab.Json.JsonObject jsonResult = (PlayFab.Json.JsonObject)result.FunctionResult;
- object messageValue; // note how “messageValue” directly corresponds to the JSON values set in CloudScript
- jsonResult.TryGetValue(“messageValue”, out messageValue);
- var list = JsonConvert.DeserializeObject<List<JObject>>(messageValue.ToString())
- .Select(x => x?.ToObject<Dictionary<string, string>>()).ToList();
- foreach (var v in list)
- {
- Debug.Log(“アイテムを獲得しました!以下が獲得したアイテムの情報です : “);
- foreach (var s in v)
- {
- Debug.Log(s.Key + “:” + s.Value);
- }
- }
- },
- error => {Debug.Log(error.Error);});
クライアント側コード
そしてこちらは実行結果のログです。ガチャを実行した結果、”frank_heavyp”というアイテムを取得しました。
ガチャ実行結果ログ
今回はAzure PlayFabを使って簡単なログイン機能とガチャ機能を実装してみましたが、いかがでしたか?
個人でゲーム開発する場合などはクライアント側に加えてバックエンド側も両方やる、というのはなかなか大変ですが、Azure PlayFabを使えばバックエンド側の実装にかかる負担をかなり減らせるのでゲーム開発が捗りそうですね!
また、ココネでは一緒に働く仲間を募集中です。
ご興味のある方は、以下のリンクからぜひご応募ください。