simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

PlayFab:UnityのバックエンドとしてのAWS入門

不正を許さないため、オンラインゲームは基本的に現実のお金でのアイテムの購入、ゲーム内の仮想通貨やアイテムの交換はクライアント側では行わずにサーバー側で行います。
そうした不正を許さないバックエンド処理に使う api とデータベースをほぼ無料で使わせてくれるMicrosoft がサポートしている PlayFab をご存知ですか?

「え!まじ!?」と思う入門者が最初に読むべきドキュメントはこちら
docs.microsoft.com

プレイヤー認証

ゲーム開始直後にプレイヤーアカウントを作成するためにIDとパスワードやメール確認などがあると、せっかく遊びに来てくれたお客さんの大半がゲームに触れることなく二度と立ち寄らないことになります。
そんな現実を重く見たPlayFab はアカウント作成のフローを非常に意識していて、最初はデバイス固有の値としてユーザーを見分けるカスタムIDにリンクして、これでユーザーをしばらく特定してゲームを進行させるデザインをとっています。

プレイヤーを作成するのは最初のカスタムIDによるアクセス時で、それ以降はサーバー側でカスタムIDとリンクされた、別のプレイヤーID x 2 を参照する形で全てのクライアントAPIが実行されます。
ゲームを提供する我々をスタジオと見立てて、それぞれ
・マスタープレイヤーID
・タイトルプレイヤーID
をそれぞれスタジオに一意に、タイトル(ゲームごと)に一意に決定して管理します。

戦略的には、後々そのユーザーがミドル・ヘビーユーザーになってくれたときにアカウント連携して、カスタムIDからリンクを解けば、偶然カスタムIDを発見した第三者にアカウントを乗っ取られることもなく
複数デバイスを持つユーザーを一意に見分け、また、スタジオ内の複数のタイトル間をまたぐプレイヤー情報を管理してタイトル間の統計を取ったりと、考え込まれた枠組みでプレイヤーによるクライアント API 実行を実現できます。

「やるじゃん!PlayFab! そこんとこもっと詳しく!」と思った方だけこちらを読むべし→ログインの基本とベストプラクティス - PlayFab | Microsoft Docs

マスターデータ

近年のゲームの面白さはパラメータの調整によって実現されています。
具体的には、プレイヤーの武器の攻撃力、攻撃回数、防御力・ライフ、敵の防御力・ライフ・攻撃力、アイテムの配置・量など(ガチャの確率・配分もかな?)
そういったゲームタイトル固有の静的にデザインされたデータをマスターデータとゲーム業界の人たちは呼ぶようです。(開発者会議とかで)
PlayFab ではそれをタイトルデータとして、テキスト形式だったり、バイナリファイル形式にして、コンテンツ配信ネットワークCDN)を使った非常に効率的な配布方法を提供してくれています。
ゲームマネージャー画面で、開発者がファイルやテキストをアップロードし、クライアントの API から取得するというスタイルでデータの授受を行います。(より具体的にはダウンロード用の一時的なurlを取得してあとは HTTP GET で好きなタイミングでダウンロードしな!って感じだそうです)
詳しくはこちら→コンテンツ配信ネットワークのクイックスタート - PlayFab | Microsoft Docs

ここでとても自然な欲求が生まれてくると思います。
そうだ、みんなで同じデータを共有し、それが動的に切り替わるようなデータも用意したいです!
残念ながら…そんな機能は PlayFab にはありません!
世界中から期待されていますが、将来的な展望として掲げていて未だ実現できていない状況(2019年8月現在)→情報ソース CloudScript Question - Playfab Community

外部サービスとの連携

無いならあきらめて PlayFab 以外で全ユーザーから読み書きするデータストアを外部サービスとして用意しよう。
これしか道がないと PlayFab の中の人も言っているので、ここは Microsoft Azure じゃなくて Amazon Web Services を使います。

手順の概要はこう
1.カスタム CloudScript を作る→具体的な手順 CloudScript のクイックスタート - PlayFab | Microsoft Docs
2.HTTP リクエストを CloudScript 内で同期呼び出しする→要するにこう

以上、url (Amazon API Gateway)の作り方、その先で呼ばれる Lambda の作り方、動き方などは…

四日間ほど Amazon の公式ドキュメントを何十ページと読んで、覚えて、理解していく苦行を続けたけど、欲しかった内容は上記の4ページ + 1 記事だけでした。
これで認証ありAPIを世界に公開しつつ、PlayFab の Cloud Script だけが認証キーを知っている形で、クライアントに一切の秘匿情報を与えずに全プレイヤーが読み書きするデータストアを提供できるようになりました。

なにはともあれ、以下の目標達成!