ユースケースサンプル: シーズンの終わりにゲーム内通貨で上位プレイヤーに報酬を与える
Reward your top players with in-game currency at the end of a season using Triggers.
読み終わるまでの所要時間 5 分最終更新 23日前
このユースケースサンプルでは、シーズンの終わりにゲーム内通貨で上位プレイヤーに報酬を与える方法を示します。このサンプルは、Leaderboards サービス によって発行される
reset前提条件
最初に、必要なアクセスロールでサービスアカウントを作成し、UGS CLI を設定する必要があります。サービスアカウントを使用した認証
Triggers サービスを呼び出す前に、サービスアカウントを使用して認証する必要があります。- Unity Cloud Dashboard に移動します。
- Administration (管理) > Service Accounts (サービスアカウント) を選択します。
- New (新規) ボタンを選択し、サービスアカウントの名前と説明を入力します。
- Create (作成) を選択します。
- Manage product roles (製品ロールの管理) を選択します。
- 以下のロールをサービスアカウントに追加します。
- LiveOps ドロップダウンから、以下のロールを選択します。
- Triggers 設定編集者
- Triggers 設定閲覧者
- Economy Resource Editor (Economy リソース編集者)
- Economy Resource Viewer (Economy リソース閲覧者)
- Leaderboards Admin (Leaderboards 管理者)
- Leaderboards Viewer (Leaderboards 閲覧者)
- Cloud Code モジュールをデプロイしている場合は、以下のロールを追加します。
- Cloud Code 編集者
- Cloud Code 閲覧者
- Cloud Code スクリプトをデプロイしている場合は、以下のロールを追加します。
- Cloud Code 編集者
- Cloud Code 閲覧者
- Cloud Code パブリッシャー
- Admin (管理者) ドロップダウンから Unity Environments Viewer (Unity 環境閲覧者) を選択します。
- LiveOps ドロップダウンから、以下のロールを選択します。
- Save (保存) を選択します。
- Add Key (キーの追加) を選択します。
- base64 エンコードを使用して Key ID (キー ID) と Secret key (秘密鍵) をエンコードします。形式は "key_id:secret_key" です。この値をメモしておきます。
UGS CLI の設定
以下のステップに従って、UGS CLI の使用を準備します。- UGS CLI をインストール します。
-
以下を使用して、プロジェクト ID と環境を設定します。
ugs config set project-id <your-project-id>
ugs config set environment-name <your-environment-name> - 以前に認証したサービスアカウントを使用して認証します。認証の取得 を参照してください。
reset イベントを調べる
リーダーボードがリセットされると、Leaderboards サービスによりresetイベントペイロードは、パラメーターとして Cloud Code に渡されます。 詳細については、Leaderboards の リセット イベント を参照してください。{ "leaderboardId": "string", "leaderboardVersionId": "string"}
デプロイファイルの作成
このサンプルは、各サービスの設定ファイルを UGS CLI を使用してデプロイすることで実装されます。 ユースケースサンプルを実装するには、以下のファイルを設定する必要があります。- : Economy の通貨設定が含まれます。
COIN.ecc - : Leaderboards の設定が含まれます。
leaderboard.lb - : Triggers の設定が含まれます。
triggers-config.tr - リーダーボードがリセットされたときにゲーム内通貨で上位プレイヤーに報酬を与えるためのロジックを定義する、Cloud Code モジュールまたはスクリプト。
reward-top-playersEconomy の設定
上位プレイヤーにゲーム内通貨で報酬を与えるには、Economy でゲーム内通貨を作成する必要があります。 UGS CLI を使用して Economy の設定ファイルを作成します。以下の内容をugs economy currency new-file COIN.ecc
COIN.eccこの設定では、ゲーム内通貨が定義され、{ "$schema": "https://ugs-config-schemas.unity3d.com/v1/economy/economy-currency.schema.json", "initial": 0, "name": "Coin"}
CoinLeaderboards の設定
UGS CLI を使用して Leaderboard の設定ファイルを作成します。以下の内容をugs leaderboards new-file leaderboard.lb
leaderboard.lbこの設定では、昇順のリーダーボードが定義され、ベストスコアが保持されます。ファイル名はリーダーボード ID に対応します。{ "$schema": "https://ugs-config-schemas.unity3d.com/v1/leaderboards.schema.json", "SortOrder": "asc", "UpdateType": "keepBest", "Name": "leaderboard"}
Cloud Code の設定
Cloud Code モジュールまたはスクリプトを作成して、リーダーボードがリセットされたときにゲーム内通貨で上位プレイヤーに報酬を与えるためのロジックを定義する必要があります。Cloud Code C# モジュール
Economy および Leaderboards Client SDK を使用して、Economy および Leaderboards サービスを操作できます。 UGS CLI を使用して新しい Cloud Code モジュールを作成します。次に、以下の内容をサンプルソリューションに追加します。文字列引数ugs cc m new-file RewardTopPlayers RewardTopPlayers
leaderboardIdusing System;using System.Collections.Generic;using System.Threading.Tasks;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Logging;using Unity.Services.CloudCode.Apis;using Unity.Services.CloudCode.Core;using Unity.Services.CloudCode.Shared;using Unity.Services.Economy.Model;using Unity.Services.Leaderboards.Model;namespace RewardTopPlayers;public class RewardTopPlayers{ private const string CoinsKey = "COIN"; private const int Amount = 10; private readonly ILogger<RewardTopPlayers> _logger; public RewardTopPlayers(ILogger<RewardTopPlayers> logger) { _logger = logger; } [CloudCodeFunction("IssueReward")] public async Task Reward(IExecutionContext ctx, IGameApiClient gameApiClient, string leaderboardId, string leaderboardVersionId) { var top5Players = await GetTop5(ctx, gameApiClient, leaderboardId, leaderboardVersionId); foreach (var score in top5Players) { try { // Retrieve the player's configuration to ensure currency configuration is synced var configResponse = await gameApiClient.EconomyConfiguration.GetPlayerConfigurationAsync(ctx, ctx.ServiceToken, ctx.ProjectId, score.PlayerId); var res = await gameApiClient.EconomyCurrencies.IncrementPlayerCurrencyBalanceAsync(ctx, ctx.ServiceToken, ctx.ProjectId, score.PlayerId, CoinsKey, new CurrencyModifyBalanceRequest(amount: Amount), configResponse.Data.Metadata.ConfigAssignmentHash); _logger.LogInformation("Incremented balance for playerId {playerId} by {amount}", score.PlayerId, Amount); } catch (ApiException e) { _logger.LogError(e, "Failed to increment balance for playerId {playerId}. Error: {Error}", score.PlayerId, e.Message); throw; } } } public async Task<List<LeaderboardEntry>> GetTop5(IExecutionContext ctx, IGameApiClient gameApiClient, string leaderboardId, string leaderboardVersionId) { try { var results = await gameApiClient.Leaderboards.GetLeaderboardVersionScoresAsync(ctx, ctx.ServiceToken, new Guid(ctx.ProjectId), leaderboardId, leaderboardVersionId, 0, 5); return results.Data.Results; } catch (ApiException e) { _logger.LogError(e, "Failed to get top players for leaderboard: {LeaderboardId}. Error: {Error}", leaderboardId, e.Message); throw new Exception($"Failed to get top players for leaderboard: {leaderboardId}. Error: {e.Message}"); } } public class ModuleConfig : ICloudCodeSetup { public void Setup(ICloudCodeConfig config) { config.Dependencies.AddSingleton(GameApiClient.Create()); } }}
Cloud Code JavaScript スクリプト
Cloud Code スクリプトを作成することで、同じ結果を実現できます。 UGS CLI を使用して新しい Cloud Code スクリプトを作成します。次に、以下の内容をサンプルスクリプトファイルに追加します。ugs cc s new-file RewardTopPlayers.js
JavaScript
const axios = require("axios");const { CurrenciesApi, ConfigurationApi } = require("@unity-services/economy-2.4");const { LeaderboardsApi } = require("@unity-services/leaderboards-1.1");module.exports = async ({ params, context, logger }) => { // Get top 5 players from the Leaderboard const leaderboardsApi = new LeaderboardsApi(context); const cointAmount = 10; let result; try { result = await leaderboardsApi.getLeaderboardVersionScores(context.projectId, params.leaderboardId, params.leaderboardVersionId, 0, 5); } catch (err) { logger.error("Failed to retrieve players from the leaderboard", { "error.message": err.message }, { "leaderboardId": params.leaderboardId }); throw err; } const currencyId = "COIN"; const currenciesApi = new CurrenciesApi(context); const configApi = new ConfigurationApi(context); // Reward currency to every player const promises = result.data.results.map(async (score) => { try { // Retrieve the player config to get the configAssignmentHash. // This is needed to ensure the currency is synced var config = await configApi.getPlayerConfiguration({ playerId: score.playerId, projectId: context.projectId, }); await currenciesApi.incrementPlayerCurrencyBalance({ currencyId, playerId: score.playerId, projectId: context.projectId, configAssignmentHash: config.data.metadata.configAssignmentHash, currencyModifyBalanceRequest: { amount: cointAmount }, }); } catch (err) { logger.error("Failed to increment currency for player", { "error.message": err.message }, { "affectedPlayerId": score.playerId }); return; } }); await Promise.all(promises);};
Triggers の設定
Cloud Code リソースをスケジュールに接続するには、トリガーを作成します。トリガーは、イベントが発生したとき、例えばリーダーボードがリセットされるたびに、Cloud Code スクリプトまたはモジュールを実行します。Cloud Code モジュールを作成した場合は、以下の設定を使用します。ugs tr new-file triggers-config.tr
Cloud Code スクリプトを作成した場合は、以下の設定を使用します。{ "$schema": "https://ugs-config-schemas.unity3d.com/v1/triggers.schema.json", "Configs": [ { "Name": "reward-leaderboard", "EventType": "com.unity.services.leaderboards.reset.v1", "ActionUrn": "urn:ugs:cloud-code:RewardTopPlayers/IssueReward", "ActionType": "cloud-code" } ]}
{ "$schema": "https://ugs-config-schemas.unity3d.com/v1/triggers.schema.json", "Configs": [ { "Name": "reward-leaderboard", "EventType": "com.unity.services.leaderboards.reset.v1", "ActionUrn": "urn:ugs:cloud-code:RewardTopPlayers", "ActionType": "cloud-code" } ]}
設定ファイルのデプロイ
reward-top-players- - Economy の通貨設定が含まれます。
COIN.ecc - - Leaderboards の設定が含まれます。
leaderboard.lb - - Triggers の設定が含まれます。
triggers-config.tr
- フォルダー - Cloud Code モジュールが含まれます。
RewardTopPlayers.sln - - Cloud Code スクリプトが含まれます。
RewardTopPlayers.js
ugs deploy .
任意: リーダーボードへのスコアの追加
以下の Cloud Code スクリプトを実行して、Unity Cloud Dashboard からリーダーボードにスコアを追加できます。すべてのテスト実行でプレイヤー ID トークンを再生成して、新しいプレイヤーを追加します。
JavaScript
これを使用して、スコアをリーダーボードに追加し、ユースケースサンプルをテストすることができます。const { LeaderboardsApi } = require("@unity-services/leaderboards-1.1");const _ = require("lodash-4.17");module.exports = async ({ params, context, logger }) => { const leaderboardsApi = new LeaderboardsApi({ accessToken: context.accessToken }); const leaderboardID = "leaderboard"; var randomScore = _.random(1, 100); try { await leaderboardsApi.addLeaderboardPlayerScore(context.projectId, leaderboardID, context.playerId, { score: randomScore }); } catch (err) { logger.error("Failed to add score to the leaderboard", { "error.message": err.message }); }};
結果の検証
結果を検証するには、リセットする前にリーダーボードからプレイヤー ID をメモしておきます。- Unity Cloud Dashboard に移動します。
- Products (製品) > Leaderboards を選択します。
- Overview (概要) セクションを選択します。
- リーダーボードを選択します。
leaderboard - Entries (エントリー) タブを選択します。
- 上位プレイヤー ID の 1 つを書き留めます。
- Unity Cloud Dashboard に移動します。
- Products (製品) > Leaderboards を選択します。
- Overview (概要) セクションを選択します。
- リーダーボードを選択します。
leaderboard - Reset Leaderboard (リーダーボードのリセット) を選択します。
- Archive current scores (現在のスコアのアーカイブ) を有効にします。
- Products (製品) > Player Management (プレイヤー管理) を選択します。
- 検索フィールドで、前に書き留めておいたプレイヤー ID を入力し、Find player (プレイヤーを検索) を選択します。
- Economy > Currencies (通貨) セクションに移動します。成功した場合、プレイヤーが 10 コインの報酬を受け取ったことが表示されます。