战斗通行证

战斗通行证为您的游戏提供额外内容,通常通过分层奖励系统,玩家可以通过玩游戏和完成特定挑战来获得奖励。战斗通行证及其相应的奖励仅在有限的时间内可用,这使其成为有效的获利和留存功能。

与基于时间的奖励系统不同,战斗通行证需要玩家具备一定程度的技巧才能在奖励路线中取得进展。此示例中的战斗通行证通过提供具有额外奖励的第二条高级路线,增添了另一层专属吸引力。

先决条件

要使用此示例用例,您必须在 Unity 项目中下载并安装 UGS 用例项目。

概述

**注意**:此示例扩展了季节性活动用例,包括具有基于积分的奖励系统的季节性战斗通行证。本主题解释了战斗通行证示例如何构建和补充季节性活动。Unity 建议在继续之前先回顾一下季节性活动用例,以了解底层实现。

每次新赛季开始时,玩家都会看到一组独特的活动奖励,他们可以通过获得赛季经验值来解锁。共有两条奖励路线

  • **免费通行证**包含所有玩家都可以获得的普通奖励。
  • **战斗通行证**需要花费 10 个宝石(高级货币),并授予额外的尊享奖励。

赛季经验值和战斗通行证仅与当前赛季相关。当一个赛季结束时,玩家的赛季经验值进度和战斗通行证所有权将重置,但他们会保留任何已领取的活动奖励。

要查看此用例的实际效果,请打开示例菜单并导航到**战斗通行证**。要直接打开此场景并与用例交互

  1. 在 Unity 编辑器的**项目**窗口中,选择**资源** > **用例示例** > **战斗通行证**,然后双击 `BattlePassSample.unity` 以打开示例场景。
  2. 按**播放**进入播放模式。

初始化

`BattlePassSceneManager.cs` 脚本在其 `Start` 函数中执行以下初始化任务

  1. 初始化 Unity 游戏服务。
  2. 使用身份验证服务以匿名方式让玩家登录。如果您之前已初始化任何其他示例场景,则身份验证将使用您缓存的玩家 ID,而不是创建新的 ID。
  3. 从经济服务中检索并更新玩家的货币余额。
  4. 使用云代码查询远程配置服务以获取与活动相关的键的当前值,例如战斗通行证内容。

功能

战斗通行证所有权令牌和奖励系统完全由云代码脚本提供支持。

玩游戏

每次您点击**玩游戏**按钮时,您都会获得 85 点赛季经验值。将发生以下情况

  1. 该按钮的 `OnClick` 方法调用 `BattlePass_GainSeasonXP.js` 云代码脚本以验证当前战斗通行证赛季,以防需要重置玩家的赛季经验值。
  2. 然后,相同的脚本会授予固定数量的赛季经验值。
  3. 如果赛季经验值增加导致等级提升,它将相应地更新奖励路线,并更新玩家在云存档中的进度。

赛季经验值条指示您当前的奖励等级以及您解锁下一等级的进度。每次解锁奖励等级时,其图标都会从锁形变为感叹号,表示您可以领取奖励。

领取奖励等级

当您点击解锁的奖励图标时,会弹出一个窗口,提示您领取该奖励等级。当您点击**领取!**按钮时,将发生以下情况

  1. 该按钮的 `OnClick` 方法调用 `BattlePass_ClaimTier.js` 云代码脚本以验证当前战斗通行证赛季,以防需要重置玩家的赛季经验值。
  2. 图标变为复选标记,表示已领取奖励。
  3. 玩家的等级进度会在云存档中再次更新。

当赛季活动结束时,所有赛季经验值和等级都会重置,但已领取的奖励会保留在您的库存中。

购买战斗通行证

点击**购买战斗通行证**按钮,花费 10 个宝石购买战斗通行证。购买战斗通行证会追溯性地向玩家授予所有先前获得的奖励等级的战斗通行证专属奖励,并使他们有资格领取后续等级的专属奖励。出于测试目的,您可以根据需要多次点击**+30**宝石按钮,通过经济服务向您的帐户添加虚拟货币。当您点击**购买战斗通行证**时,将发生以下情况

  1. 该按钮的 `OnClick` 方法调用 `BattlePass_PurchaseBattlePass.js` 云代码脚本,该脚本验证玩家是否有足够的宝石通过经济服务进行虚拟购买。
  2. 如果玩家有足够的宝石购买战斗通行证,则云代码脚本会通过经济服务授予任何先前解锁的战斗通行证奖励。
  3. 最后,云代码脚本会更新玩家在云存档中的战斗通行证所有权状态,并且 UI 代码会禁用**购买战斗通行证**按钮,直到下个赛季。

**提示**:您可以点击背包图标查看您已领取的库存物品。

**注意**:此示例使用货币作为高级奖励,尽管大多数多人游戏都旨在在高级级别奖励装饰性物品或其他不会给玩家带来游戏优势的物品。

乍一看,似乎其中一些操作可以直接调用每个服务来简化操作。例如,要获取玩家的进度,您可以直接从云存档 SDK 下载当前玩家状态,要购买战斗通行证,您可以直接调用经济 SDK。但是,这些操作可能会产生连锁反应,而服务器授权的方式更安全

  • 检索玩家进度时,如果赛季已更改,您还需要重置玩家的进度。
  • 购买战斗通行证时,您还想为玩家已领取的等级授予任何高级奖励。

设置

要求

要复制此用例,您需要在项目中使用以下Unity 包

作用
可寻址资产允许开发者使用地址检索资源。在此示例中,服务根据从远程配置接收到的信息查找特定于活动的图像和预制件。
身份验证自动以匿名方式让用户登录,以便在服务器端跟踪其数据。
云代码在服务器端包含重要的验证逻辑。在此示例中,它有四个主要用途

- 检索玩家的赛季进度,如果赛季已更改,则重置其进度。
- 获得赛季经验值,可能会解锁新的奖励等级。
- 领取奖励等级,授予货币或库存物品。
- 购买战斗通行证,这将解锁更多奖励,并可能授予先前已领取等级的奖励。
云存档 *存储玩家的赛季经验值进度和战斗通行证所有权令牌。此示例实际上并未使用 C# 中的云存档方法,因为所有云存档工作都在云代码脚本中进行。
部署提供用于部署云服务资源的统一接口。
经济在运行时检索玩家的起始和更新后的货币余额。
游戏覆盖*配置四个战斗通行证赛季,并根据当前时间判定哪个游戏覆盖处于活动状态,返回不同的奖励等级。注意:这些赛季配置与季节性活动用例示例共享。
远程配置 *提供键值对,其中映射到给定键的值可以在服务器端更改,可以手动更改,也可以根据特定的游戏覆盖进行更改。

* 在此示例中,云存档、游戏覆盖和远程配置服务仅在云代码(服务器)端使用。虽然这些服务在用例中发挥着重要作用,但您无需在 Unity 项目中安装它们的 SDK。

要在您的游戏中使用这些服务,请在 Unity 云面板 中为您的组织和项目激活每项服务。

Unity 云服务配置

要在您自己的 Unity 项目中复制此示例场景的设置,请配置以下项目

  • 云代码脚本
  • 经济项目
  • 远程配置值
  • 远程配置游戏覆盖

要配置这些项目,您可以 使用部署包,或 使用 Unity 云面板手动输入。建议的最佳做法是使用部署包,因为它可以大大加快此过程。

使用部署包

要使用部署包部署配置,请执行以下操作

  1. 打开部署窗口
  2. 选中“通用”和“战斗通行证”。
  3. 单击“部署选择”。

这将部署以下项目

  • 云代码脚本
  • 经济项目
  • 远程配置值

部署包不支持以下项目

  • 远程配置游戏覆盖

要配置它们,请参阅使用 Unity 云面板

使用 Unity 云面板

您可以使用Unity 云面板按项目和环境手动配置您的服务。请参阅以下部分以配置此示例。

云代码

在 Unity 云面板中发布以下脚本

脚本参数描述在项目中的位置
BattlePass_GetState检索并验证当前事件配置。Assets/Use Case Samples/Battle Pass/Cloud Code/BattlePass_GetState.js
BattlePass_GainSeasonXP数量
单击“玩游戏”按钮后获得的赛季经验值数量。
检查以验证当前战斗通行证赛季是否需要重置玩家的赛季经验值,然后授予固定数量的赛季经验值。Assets/Use Case Samples/Battle Pass/Cloud Code/BattlePass_GainSeasonXP.js
BattlePass_ClaimTier等级索引
单击“领取!”按钮后要授予的奖励等级的从 0 开始的索引。
从相应的索引奖励等级授予奖励。Assets/Use Case Samples/Battle Pass/Cloud Code/BattlePass_ClaimTier.js
BattlePass_ClaimTier通过更新玩家的所有权令牌、扣除宝石以及追溯授予之前解锁的所有战斗通行证奖励,为战斗通行证执行虚拟购买。Assets/Use Case Samples/Battle Pass/Cloud Code/BattlePass_ClaimTier.js

**注意**:“云代码”文件夹中包含的云代码脚本是本地副本,因为您无法查看示例项目的仪表板。对这些脚本的更改不会影响此示例的行为,因为它们不会自动上传到云代码服务。

经济

在 Unity 云面板中配置以下资源

资源类型资源名称ID描述
货币宝石GEM一种用于购买战斗通行证的付费货币,也是领取战斗通行证奖励等级的潜在奖励。
货币硬币COIN在某些战斗通行证奖励等级中授予的软货币。
货币珍珠PEARL在某些战斗通行证奖励等级中授予的软货币。
货币星星STAR春季和夏季活动期间的挑战奖励
库存物品SWORD某些战斗通行证奖励等级授予的库存物品。
库存物品盾牌SHIELD某些战斗通行证奖励等级授予的库存物品。

此外,为战斗通行证配置以下虚拟购买

虚拟购买名称ID此购买获得此购买花费
战斗通行证购买BATTLE_PASS_PURCHASE无 *宝石 (10)

* 云代码不会向玩家授予虚拟物品,而是在云存档中授予玩家战斗通行证所有权。

远程配置

在 Unity 云面板中设置以下配置值

类型描述
EVENT_NAME字符串要在场景中显示的事件的名称。空默认值
EVENT_KEY字符串用于查找特定于事件的值的键,例如特定图像的地址。空默认值
EVENT_END_TIME整数游戏覆盖处于活动状态的最后一分钟的最后一位数字。用于确定当前事件剩余时间。0
EVENT_TOTAL_DURATION_MINUTES整数给定赛季的游戏覆盖处于活动状态的总分钟数。0
BATTLE_PASS_TIER_COUNT整数每个赛季的奖励等级总数(在本例中未被游戏覆盖覆盖)。10
BATTLE_PASS_SEASON_XP_PER_TIER整数解锁每个等级所需的赛季经验值数量(在本例中未被游戏覆盖覆盖)。100
BATTLE_PASS_REWARDS_FREEJSON指定玩家在领取每个等级时游戏分配哪些奖励的 JSON(由季节性游戏覆盖覆盖)。
注意:此示例中的架构每个等级只允许一个奖励。
[]
注意:奖励等级在季节性活动之外无效。
BATTLE_PASS_REWARDS_PREMIUMJSON指定玩家在拥有战斗通行证时游戏为每个等级分配哪些奖励的 JSON(由季节性游戏覆盖覆盖)。
注意:此示例中的架构每个等级只允许一个奖励。
[]
注意:奖励等级在季节性活动之外无效。

游戏覆盖

在 Unity 云面板中配置以下覆盖

详细信息将覆盖命名为“秋季活动”。
定位

选择包含以下 JEXL 代码的 JEXL

user.timestampMinutes % 10 == 0 || user.timestampMinutes % 10 == 1 || user.timestampMinutes % 10 == 2
内容

选择 选择内容类型 > 配置覆盖,然后输入以下键的覆盖值

  • EVENT_NAME:“秋季活动
  • EVENT_KEY:“秋季
  • EVENT_END_TIME2
  • EVENT_TOTAL_DURATION_MINUTES3
  • BATTLE_PASS_FREE:
    [{
        "service": "inventory",
        "id": "SHIELD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Shield"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 50,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "STAR",
        "quantity": 3,
        "spriteAddress": "Sprites/Currency/Star"
    }, {
        "service": "inventory",
        "id": "SWORD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Sword"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "currency",
        "id": "STAR",
        "quantity": 3,
        "spriteAddress": "Sprites/Currency/Star"
    }, {
        "service": "inventory",
        "id": "SHIELD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Shield"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 50,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 2,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "inventory",
        "id": "SWORD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Sword"
    }]
  • BATTLE_PASS_PREMIUM:
    [{
        "service": "currency",
        "id": "PEARL",
        "quantity": 10,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 3,
        "spriteAddress": "Sprites/Currency/Gem"
    }, {
        "service": "currency",
        "id": "STAR",
        "quantity": 7,
        "spriteAddress": "Sprites/Currency/Star"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 100,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 2,
        "spriteAddress": "Sprites/Currency/Gem"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 200,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 10,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 2,
        "spriteAddress": "Sprites/Currency/Gem"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 200,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 4,
        "spriteAddress": "Sprites/Currency/Gem"
    }]
计划

设置以下开始和结束日期

  • 开始日期 设置为 立即更新内容
  • 结束日期 设置为 无限期运行
状态

创建完游戏覆盖后,单击“启用”。

详细信息将覆盖命名为“冬季活动”。
定位

选择包含以下 JEXL 代码的 JEXL

user.timestampMinutes % 10 == 3 || user.timestampMinutes % 10 == 4
内容

选择 选择内容类型 > 配置覆盖,然后输入以下键的覆盖值

  • EVENT_NAME:“冬季活动
  • EVENT_KEY:“冬季
  • EVENT_END_TIME4
  • EVENT_TOTAL_DURATION_MINUTES2
  • BATTLE_PASS_FREE:
    [{
        "service": "inventory",
        "id": "SWORD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Sword"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "inventory",
        "id": "SHIELD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Shield"
    }, {
        "service": "currency",
        "id": "STAR",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Star"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 50,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "inventory",
        "id": "SWORD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Sword"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "currency",
        "id": "STAR",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Star"
    }, {
        "service": "inventory",
        "id": "SHIELD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Shield"
    }]
  • BATTLE_PASS_PREMIUM:
    [{
        "service": "currency",
        "id": "COIN",
        "quantity": 100,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 3,
        "spriteAddress": "Sprites/Currency/Gem"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 7,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 100,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 2,
        "spriteAddress": "Sprites/Currency/Gem"
    }, {
        "service": "currency",
        "id": "STAR",
        "quantity": 5,
        "spriteAddress": "Sprites/Currency/Star"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 200,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 2,
        "spriteAddress": "Sprites/Currency/Gem"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 200,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 4,
        "spriteAddress": "Sprites/Currency/Gem"
    }]
计划

设置以下开始和结束日期

  • 开始日期 设置为 立即更新内容
  • 结束日期 设置为 无限期运行
状态

创建完游戏覆盖后,单击“启用”。

详细信息将覆盖命名为“春季活动”。
定位

选择包含以下 JEXL 代码的 JEXL

user.timestampMinutes % 10 == 5 || user.timestampMinutes % 10 == 6 || user.timestampMinutes % 10 == 7
内容

选择 选择内容类型 > 配置覆盖,然后输入以下键的覆盖值

  • EVENT_NAME:“春季活动
  • EVENT_KEY:“春季
  • EVENT_END_TIME7
  • EVENT_TOTAL_DURATION_MINUTES3
  • BATTLE_PASS_FREE:
    [{
        "service": "inventory",
        "id": "SHIELD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Shield"
    }, {
        "service": "currency",
        "id": "STAR",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Star"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "inventory",
        "id": "SWORD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Sword"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 50,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "inventory",
        "id": "SHIELD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Shield"
    }, {
        "service": "currency",
        "id": "STAR",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Star"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 50,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "inventory",
        "id": "SWORD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Sword"
    }]
  • BATTLE_PASS_PREMIUM:
    [{
        "service": "currency",
        "id": "PEARL",
        "quantity": 10,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 3,
        "spriteAddress": "Sprites/Currency/Gem"
    }, {
        "service": "currency",
        "id": "STAR",
        "quantity": 7,
        "spriteAddress": "Sprites/Currency/Star"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 100,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 2,
        "spriteAddress": "Sprites/Currency/Gem"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 200,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 10,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 2,
        "spriteAddress": "Sprites/Currency/Gem"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 200,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 4,
        "spriteAddress": "Sprites/Currency/Gem"
    }]
计划

设置以下开始和结束日期

  • 开始日期 设置为 立即更新内容
  • 结束日期 设置为 无限期运行
状态

创建完游戏覆盖后,单击“启用”。

详细信息将覆盖命名为“夏季活动”。
定位

选择包含以下 JEXL 代码的 JEXL

user.timestampMinutes % 10 == 8 || user.timestampMinutes % 10 == 9
内容

选择 选择内容类型 > 配置覆盖,然后输入以下键的覆盖值

  • EVENT_NAME:“夏季活动
  • EVENT_KEY:“夏季
  • EVENT_END_TIME9
  • EVENT_TOTAL_DURATION_MINUTES2
  • BATTLE_PASS_FREE:
    [{
        "service": "inventory",
        "id": "SWORD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Sword"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "currency",
        "id": "STAR",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Star"
    }, {
        "service": "inventory",
        "id": "SHIELD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Shield"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 50,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "inventory",
        "id": "SWORD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Sword"
    }, {
        "service": "currency",
        "id": "STAR",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Star"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 1,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "inventory",
        "id": "SHIELD",
        "quantity": 1,
        "spriteAddress": "Sprites/Inventory/Shield"
    }]
  • BATTLE_PASS_PREMIUM:
    [{
        "service": "currency",
        "id": "COIN",
        "quantity": 100,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 3,
        "spriteAddress": "Sprites/Currency/Gem"
    }, {
        "service": "currency",
        "id": "PEARL",
        "quantity": 7,
        "spriteAddress": "Sprites/Currency/Pearl"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 100,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 2,
        "spriteAddress": "Sprites/Currency/Gem"
    }, {
        "service": "currency",
        "id": "STAR",
        "quantity": 5,
        "spriteAddress": "Sprites/Currency/Star"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 200,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 2,
        "spriteAddress": "Sprites/Currency/Gem"
    }, {
        "service": "currency",
        "id": "COIN",
        "quantity": 200,
        "spriteAddress": "Sprites/Currency/Coin"
    }, {
        "service": "currency",
        "id": "GEM",
        "quantity": 4,
        "spriteAddress": "Sprites/Currency/Gem"
    }]
计划

设置以下开始和结束日期

  • 开始日期 设置为 立即更新内容
  • 结束日期 设置为 无限期运行
状态

创建完游戏覆盖后,单击“启用”。

**注意**:此示例根据当前服务器时间中分钟数的最后一位数字确定应返回哪个游戏覆盖数据。这是一种简化,以便能够频繁地观察季节变化。在真实的应用程序中,开发者可能会将游戏覆盖设置为具有特定的开始和结束日期,然后远程配置会根据服务器的日期和时间确定何时显示游戏覆盖。在这种情况下,客户端和服务器的实现可能略有不同。