Unity ゲーミングサービス(UGS)の Use Cases は、どのように複数の UGS 製品を使えば、ゲーム開発でよくある課題を解決できるかを示すように設計されたサンプル集です。
これらのサンプルは、ゲームのバックエンドにおける典型的なユースケースとゲームデザイン要素を実装したもので、特定の開発タスクを解決する方法を示し、プロジェクトにさまざまな UGS パッケージを統合することによって、ゲームのバックエンドにおいて実現できる効率性を提示するものです。
サンプルの 1 つ「Battle Pass」は、無料プレイヤーと課金プレイヤーのそれぞれについて、シーズンごとにポイントに応じた報酬を与えるシステムです。この記事では、このサンプルの仕組みと、自分のゲームに実装する方法について説明します。
これは現在進行中の Unity プロジェクトで、ダウンロードして Unity エディターで実行することができます。そして、Unity ゲーミングサービスを使うことで、さまざまなユースケースに対応できることを、コードを見て確認することができます。
このプロジェクトの主な目的は、開発者に実際に動くサンプルを使ってもらって、立ち上げのプロセスをより速く進めてもらうことです。コードは読みやすく、あらゆるレベルの開発者が利用できるように設計されています。
バトルパスは、ゲームを遊ぶことに対して報酬を出すことでプレイヤーの囲い込むためによく利用される方法です。さらに課金するプレイヤー層を取り込むことで、長期的にゲームの収益を向上させる効果もあります。
一般的には以下のように分解されます。
ライブゲーム、特にマルチプレイのゲームでは、サーバーがプレイヤーのデータの大半についての信頼できる情報源であるべきです。
これにより、他のプレイヤーよりも有利になるような不正行為や、本来は購入または獲得する必要があるアイテムや通貨を誤ってプレイヤーに付与することを防ぐことができます。
同様に、シーズンごとの報酬やバトルパスがすべてのプレイヤーにとって公平であるためには、すべてのデータと決定をサーバー側で管理する必要があります。
このバトルパスサンプルの設計では、Cloud Code (ベータ版)サービスが、バックエンドのインフラの処理について、面倒な処理をほとんどこなしています。Cloud Code では、ゲームロジックをクライアントから分離して書き、実行することができます。
その他、このサンプルでは、プレイヤーデータをクラウドに保存できる Cloud Save (ベータ版)などを使用しています。この場合、プレイヤーのシーズン経過をフラットな Key-Value システムで保存することができます。また、現在のシーズンのバトルパス所有フラグも Cloud Save で保存されます。
Game Overrides(Remote Config を活用)を使えば、ゲーム内でパーソナライズされたプレイヤー体験を作成し、現在のシーズンやバトルパスのティアの内容を決定することができます。
バトルパスのティア報酬はすべて通貨かインベントリアイテムで、これらはすべて Economy (ベータ版)で管理されています。また、Economy にはバトルパスとジェムを交換するための Purchase が 1 つセットアップされています。
プレイヤーのデータがオンラインのバックエンドで管理されている他のゲームと同様、各プレイヤーはゲームにサインインする必要があります。これには、Authentication(ベータ版)を使用しています。ユーザーがサインインすると、すべての Unity ゲーミングサービス SDKは、すべてのサーバーリクエストでプレイヤーの固有 ID を送信すべきであることを自動的に検知します。
サンプルの仕組みは以下のようになっています。
プレイヤーの状態は、Cloud Save を使ってクライアントから直接取得・設定することもできますが、今回はそうしないほうがいいでしょう。
Cloud Save のデータを直接設定すると、プレイヤーデータがサーバー権威ではなく、クライアント権威になるため、ハッキングの可能性が生じます。Cloud Code を使うことで、Cloud Save にデータを書き込む前に、変更点を検証することができます。
Cloud Save から直接プレイヤーの状態を読み出すと、終了した前のシーズンのデータを取得してしまう可能性があります。Cloud Code を使うことで、シーズンが終了した場合、プレイヤーのシーズン状態を自動的にリセットすることができます。
このサンプルパッケージを使うことで、Unity ゲーミングサービスで機能を完備したサーバー権威型のバトルパスを実装することができます。
Unity ダッシュボード内で Game Overrides キャンペーンを設定し、JSON 値を入力することで、一定期間のゲームのバトルパス設定を定義することができます。
キャンペーンは 1 時間や週末、バトルパスの場合はシーズン中の数か月など、どのような期間でも可能です。
プレイヤーがゲームの UI とインタラクションすることで、Cloud Code のリクエストが送信され、以下のような処理が呼び出されます。
シーズン経験値を獲得する
報酬を請求する
バトルパスを購入する
プレイヤーのシーズン経過を記録する
ゲームクライアントに進行状況データを返す
これらの呼び出しの中には、Economy または Cloud Code を直接呼び出すことで、より簡単に呼び出すことができるものがあります。ただし、このようなリクエストの場合、シーズンが変わった場合や、そのプレイヤーが初めてシステムに参加する場合は、プレイヤーのシーズン経過も再初期化する必要があるかもしれません。
各リクエストを行う前に、シーズンデータを再初期化する必要があるかどうかをクライアントが判断するようでは困ります。
このバトルパスのサンプルの設計では、バトルパスにアップグレードすると(すでに無料報酬を請求した後)、プレイヤーの過去の報酬が自動的に付与されます。このため、バトルパスの購入手続きは、Cloud Code 機能を通じてのみ行うことができます。
この機能は、Economy を呼び出して、費用はかかるが報酬のない買い物を完了させるものです。それが成功すると、2 つのことが起こります。
バトルパスが Cloud Save に保存される値の形でプレイヤーに付与される。その値は現在のシーズンのバトルパスだけを表す。
プレイヤーに、すでに請求したティアのバトルパス報酬が付与される。
シーズンごとの報酬やバトルパスの設計はいろいろ考えられますが、Unity ゲーミングサービスではこの例に限定されません。
Unity の In-app Purchase パッケージを使用すると、ゲーム内通貨ではなく、バトルパスに現実のお金を課金することができます。
Unity ゲーミングサービス Use Cases コレクションには、バトルパス以外にもいくつかのサンプルパッケージが含まれています。
このプロジェクトは、Unity ゲーミングサービスの使用例を増やすために成長し続けるので、時折 GitHub リポジトリをチェックしていただければと思います。