不正を許さないため、オンラインゲームは基本的に現実のお金でのアイテムの購入、ゲーム内の仮想通貨やアイテムの交換はクライアント側では行わずにサーバー側で行います。
そうした不正を許さないバックエンド処理に使う 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 内で同期呼び出しする→要するにこう
できたー!!
— Simplestar@Unityゲーム開発 (@lpcwstr) August 14, 2019
Unity ⇄ PlayFab(Cloud Script) ⇄ AWS Lambda (API Gateway認証あり ⇄ Lambda ⇄ DynamoDB, S3 とか)
これで Unity オンラインゲームのバックエンドを好き放題設計できるぞ!やっと土台が固まってきた pic.twitter.com/Gg147Bqvhr
以上、url (Amazon API Gateway)の作り方、その先で呼ばれる Lambda の作り方、動き方などは…
API Gateway 概念一覧
— Simplestar@Unityゲーム開発 (@lpcwstr) August 13, 2019
API には必ずルートリソースがあって
そのルートリソースにぶら下げるようにリソースを作っていき
作ったリソースにHTTPメソッドを追加して
適当な名前のステージを作って、そのステージに API をデプロイする
統合で呼び出し元からカプセル化されるhttps://t.co/gaONpmklM7
API Gateway の入門として、これ以上ないくらいいいページだった。
— Simplestar@Unityゲーム開発 (@lpcwstr) August 13, 2019
次のリンクから理解を深めてくださいという宿題付きhttps://t.co/imiMRaLJVf
初めてAWS Lambda を触るならこの記事がおすすめ!
— Simplestar@Unityゲーム開発 (@lpcwstr) August 12, 2019
作者のわかりやすい文章作成術に感服する
今度こそ理解する!俺式Lambda入門|クラスメソッドブログ https://t.co/MkvrrBZH1G
ずっと AWS Lambda の公式ドキュメントを読み続けてます。(まだ途中)
— Simplestar@Unityゲーム開発 (@lpcwstr) August 12, 2019
AWS Lambda から cache サーバー読み書きする公式最小サンプル見つけた
これ欲しかったコード例だhttps://t.co/613UZv0E3A
API Gateway で用意した、世界中から実行できてしまうメソッドについて
— Simplestar@Unityゲーム開発 (@lpcwstr) August 13, 2019
API Gateway Authorizer というものを、そのメソッドに設定すると、リクエスト内容からキー情報を取り出して認証しつつ、一回認証したら一定時間キャッシュして高速にアクセス可能にできるhttps://t.co/3xUypphIAi
四日間ほど Amazon の公式ドキュメントを何十ページと読んで、覚えて、理解していく苦行を続けたけど、欲しかった内容は上記の4ページ + 1 記事だけでした。
これで認証ありAPIを世界に公開しつつ、PlayFab の Cloud Script だけが認証キーを知っている形で、クライアントに一切の秘匿情報を与えずに全プレイヤーが読み書きするデータストアを提供できるようになりました。
なにはともあれ、以下の目標達成!
待つのもいいけど、この夏休みはCloudScriptから呼び出す外部サービスとしてAWSのLambdaやDynamoDBやRedisとか、そのへんをセキュアに高速に読み書きできるための基礎知識を脳に定着させておきたい(ブロックの部品のように)
— Simplestar@Unityゲーム開発 (@lpcwstr) August 10, 2019
Unity が呼び出す先のバックエンドを作れる人に1週間でなれるところまで