开始使用
Follow this workflow to set up Triggers and automate rewarding top players from Leaderboards.
阅读时间8 分钟最后更新于 1 个月前
本节介绍开始使用 Triggers 所需的所有步骤。 以下示例演示了如何使用 Triggers 在 Cloud Save 中根据 Scheduler 发出的一次性计划事件向 Leaderboards 排行榜前五名玩家授予相应的赛季奖杯。
视频演示
观看下面的视频,了解在 Unity Dashboard(Unity 后台)中创建触发器的具体步骤。典型工作流程
要开始使用 Triggers,请执行以下步骤:- 创建一个要在事件发生时运行的 Cloud Code 脚本或模块:定义触发事件时要执行的游戏逻辑。
- 计划一个事件以更改资源的状态:定义触发事件的时间。
- 配置一个触发器以在事件发生时执行 Cloud Code 模块终端:定义触发事件时要执行的 Cloud Code 脚本或模块。
- 验证结果:检查是否已执行 Cloud Code 脚本或模块。
先决条件
以下步骤假定您已经在 Unity Cloud Dashboard 中创建了 Unity Gaming Services(Unity 游戏服务)项目。 必须首先创建具有所需访问角色的服务帐户,并配置 UGS CLI。使用服务帐户进行身份验证
在调用 Scheduling 和 Triggers 服务之前,必须使用服务帐户进行身份验证。- 导航到 Unity Cloud Dashboard。
- 选择 Administration(管理)> Service Accounts(服务帐户)。
- 选择 New(新建) 按钮并输入服务帐户的名称和描述。
- 选择 Create(创建)。
- 选择 Manage product roles(管理产品角色)。
- 将以下角色添加到服务帐户:
- 从 LiveOps 下拉选单中,选择 Triggers Configuration Editor(Triggers 配置编辑者)、Triggers Configuration Viewer(Triggers 配置查看者)、Scheduler Configuration Editor(Scheduler 配置编辑者)、Scheduler Configuration Viewer(Scheduler 配置查看者) 和 Leaderboards Admin(Leaderboards 管理员)。
- 从 Admin(管理)下拉选单中,选择 Unity Environments Viewer(Unity 环境查看者)。
- 从 LiveOps 下拉选单中,选择 Triggers Configuration Editor(Triggers 配置编辑者)、Triggers Configuration Viewer(Triggers 配置查看者)、Scheduler Configuration Editor(Scheduler 配置编辑者)、Scheduler Configuration Viewer(Scheduler 配置查看者) 和 Leaderboards Admin(Leaderboards 管理员)。
- 选择 Save(保存)。
- 选择 Add Key(添加密钥)。
- 使用 base64 编码方式对 Key ID(密钥 ID) 和 Secret key(密钥) 进行编码。格式为“key_id:secret_key”。请记下此值。
配置 UGS CLI
按照以下步骤操作以开始使用 UGS CLI:- 安装 UGS CLI。
-
按如下方式配置 Project ID 和环境:
ugs config set project-id <your-project-id>
ugs config set environment-name <your-environment-name> - 使用您先前创建的服务帐户进行身份验证。请参阅接受身份验证。
设置 Leaderboards
要按照此示例操作,应创建一个排行榜。 您可以使用 UGS CLI 部署以下leaderboard.lbnew-file文件名与排行榜 ID 相对应。使用以下配置来更新ugs leaderboards new-file leaderboard
leaderboard.lb使用 UGS CLI 工具部署此文件:{ "$schema": "https://ugs-config-schemas.unity3d.com/v1/leaderboards.schema.json", "SortOrder": "asc", "UpdateType": "keepBest", "Name": "leaderboard"}
您现在已经创建了排行榜,接下来可以向其中添加分数。ugs deploy leaderboard.lb
可选:向排行榜添加分数
您可以运行以下 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 }); }};
设置 Cloud Code
要使用 Triggers,您应该定义一个 Cloud Code 模块或 Cloud Code 脚本。触发器触发时将执行这个模块或脚本。以下示例会将 Leaderboards 和 Cloud Save 与 Cloud Code 集成在一起,向排行榜前五名的玩家授予赛季奖杯。Cloud Code C# 模块
定义一个SchedulerHelloWorldkeyvalueRewardPlayers部署该模块。 请参阅部署 Hello World 以了解如何部署模块。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.CloudSave.Model;using Unity.Services.Leaderboards.Model;namespace SchedulerHelloWorld;public class SchedulerHelloWorld{ private const string LeaderboardId = "leaderboard"; private readonly ILogger<SchedulerHelloWorld> _logger; public SchedulerHelloWorld(ILogger<SchedulerHelloWorld> logger) { _logger = logger; } [CloudCodeFunction("RewardPlayers")] public async Task RewardPlayers(IExecutionContext ctx, IGameApiClient gameApiClient, string key, string value) { var top5Players = await GetTop5(ctx, gameApiClient); foreach (var score in top5Players) { try { var response = await gameApiClient.CloudSaveData.SetItemAsync(ctx, ctx.ServiceToken, ctx.ProjectId, score.PlayerId, new SetItemBody(key, value)); _logger.LogInformation("Data saved successfully"); } catch (ApiException e) { _logger.LogError( "Failed to record data for playerId {playerId}. Error: {Error}", score.PlayerId, e.Message); throw new Exception($"Failed to record data for playerId {score.PlayerId}. Error: {e.Message}"); } } } [CloudCodeFunction("GetTopPlayers")] public async Task<List<LeaderboardEntry>> GetTop5(IExecutionContext ctx, IGameApiClient gameApiClient) { try { var results = await gameApiClient.Leaderboards.GetLeaderboardScoresAsync(ctx, ctx.ServiceToken, new Guid(ctx.ProjectId), LeaderboardId, null, 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 脚本来实现相同的结果。 创建一个包含必需字符串参数keyvalueSchedulerHelloWorldJavaScript
发布该脚本。 请参阅部署 Hello World 以了解如何部署脚本。const { DataApi } = require("@unity-services/cloud-save-1.4");const { LeaderboardsApi } = require("@unity-services/leaderboards-1.1");module.exports = async ({ params, context, logger }) => { // Get top 5 players from the Leaderboard const leaderboardId = "my-leaderboard"; const leaderboardsApi = new LeaderboardsApi(context); const cloudSaveApi = new DataApi(context); let result; try { result = await leaderboardsApi.getLeaderboardScores(context.projectId, leaderboardId, 0, 5); } catch (err) { logger.error("Failed to retrieve players from the leaderboard", { "error.message": err.message }); throw err; } // Set Cloud Save data for every player const promises = result.data.results.map(async (score) => { try { await cloudSaveApi.setItem(context.projectId, score.playerId, { key: params.key, value: params.value, }); } catch (err) { logger.error("Failed to update Cloud Save data", { "error.message": err.message }, { "affectedPlayerId": score.playerId }); return; } }); await Promise.all(promises);};
计划事件
定义 Cloud Code 脚本或模块后,您可以创建一个计划来确定向前五名玩家授予奖杯的时间。 以下示例定义了一个向玩家授予赛季奖杯的一次性计划。 运行new-file使用以下配置来更新ugs scheduler new-file schedule-config
schedule-config.sched事件的{ "$schema": "https://ugs-config-schemas.unity3d.com/v1/schedules.schema.json", "Configs": { "grant-trophy": { "EventName": "trophy-for-top-5", "Type": "one-time", "Schedule": "2024-08-28T00:00:00Z", "PayloadVersion": 1, "Payload": "{\"key\": \"seasonal-trophy\", \"value\": \"2024-08-28\"}" } }}
payloadschedule您应该会看到类似于以下内容的响应:ugs deploy schedule-config.sched
现在,您有了一个在特定时间触发事件的计划。但是,这些事件尚未关联到您的 Cloud Code 脚本或模块。Deployed:schedule-config.sched
配置触发器
要将 Cloud Code 资源关联到计划,请创建触发器。触发器会在触发事件时(例如,触发计划时)执行 Cloud Code 模块或脚本。 运行new-file如果您创建了 Cloud Code 模块,请使用以下配置来更新ugs triggers new-file triggers-config
triggers-config.tr如果您创建了 Cloud Code 脚本,请使用以下配置来更新{ "$schema": "https://ugs-config-schemas.unity3d.com/v1/triggers.schema.json", "Configs": [ { "Name": "trophy-reward", "EventType": "com.unity.services.scheduler.trophy-for-top-5.v1", "ActionUrn": "urn:ugs:cloud-code:SchedulerHelloWorld/RewardPlayers", "ActionType": "cloud-code" } ]}
triggers-config.tr使用 UGS CLI 工具部署此配置:{ "$schema": "https://ugs-config-schemas.unity3d.com/v1/triggers.schema.json", "Configs": [ { "Name": "trophy-reward", "EventType": "com.unity.services.scheduler.trophy-for-top-5.v1", "ActionUrn": "urn:ugs:cloud-code:SchedulerHelloWorld", "ActionType": "cloud-code" } ]}
您应该会看到类似于以下内容的响应:ugs deploy triggers-config.tr
现在,您有了一个触发器会在触发事件时执行 Cloud Code 脚本或模块。Deployed:triggers-config.tr
验证结果
要验证结果,您可以在触发事件之前和之后检查排名靠前的玩家。- 导航到 Unity Cloud Dashboard。
- 选择 Products(产品)> Leaderboards。
- 选择 Overview(概览) 部分。
- 选择 排行榜。
leaderboard - 选择 Entries(条目) 选项卡。
- 记下排名靠前的玩家 ID 之一。
- 在 Unity Cloud Dashboard 中,选择 Products(产品)> Player Management(玩家管理)。
- 在搜索字段中,输入您先前记下的玩家 ID,然后选择 Find Player(查找玩家)。
- 导航到 Cloud Save > Data(数据) 部分。
- 您应该会发现值为 的
2023-08-28键。seasonal-trophy
- 在 Unity Cloud Dashboard 中,打开 Cloud Code。
- 选择 Logs(日志)。
SchedulerHelloWorld