每日奖励

每日奖励日历是普遍存在的互动功能,可以提高所有类型游戏的留存率。提前向玩家展示一系列不断升级的奖励,可以激励他们持续登录以领取越来越好的奖品。本示例演示如何展示一个奖励价值随着时间推移而不断增加的日历,从而鼓励玩家每天回来领取奖励。这种实现允许跳过天数,但玩家始终按顺序领取奖励。如果他们错过了一天,第二天仍然可以领取相同的奖励。玩家必须领取某一天的奖励才能解锁下一天的奖励。

先决条件

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

概述

本示例演示如何初始化 Unity 服务、从经济服务检索和更新当前值、调用云代码以检索更新状态,然后领取每一天的奖励。

注意:Unity 建议使用远程配置设置开始时间戳来实现每日奖励,以便所有玩家都能在当月的第一天体验到该活动。但是,为了方便测试,此实现将活动开始值保存到云存档,因此活动“月”从您第一次打开场景时开始。每个“天”也被压缩成 30 秒,这样您就可以快速测试领取一个月的奖励。

要查看此用例的实际效果,请 打开示例菜单,然后导航到每日奖励。要直接打开此场景并与用例进行交互

  1. 在 Unity 编辑器项目窗口中,选择Assets > Use Case Samples > Daily Rewards,然后双击DailyRewardsSample.unity以打开示例场景。
  2. 播放进入播放模式。

初始化

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

  1. 初始化 Unity 游戏服务。
  2. 使用身份验证服务 匿名登录 玩家。如果您之前已初始化任何其他示例场景,身份验证将使用您的缓存玩家 ID,而不是创建新的玩家 ID。
  3. 从经济服务检索和更新玩家的货币余额。
  4. 从 Addressables 服务检索所有货币精灵,以便它们可以在日历中显示。
  5. 从远程配置服务检索每日奖励活动状态,以显示已领取的天数和日历中剩余的天数。

功能

当您关闭事件提示时,场景将开始跟踪时间的推移,以确定您是否在某一天的有效窗口内领取奖励。出于测试目的,每个“天”持续约 30 秒。每个日历节点都有一个领取按钮,只有在满足以下两个条件时该按钮才会处于活动状态

  1. 已领取前一天的奖励。
  2. 新的一天已经开始。

当您点击活动的领取按钮时,您将获得当天的奖励。将执行以下操作

  1. 按钮的OnClick方法执行DailyRewardsSceneManager.cs脚本的OnClaimButtonPressed函数,该函数验证玩家是否已登录,然后调用DailyRewards_Claim云代码脚本以授予奖励并更新事件状态以记录已领取的天数和最后领取时间。
  2. 经济服务更新玩家的货币余额并将新值返回到客户端,以更新货币 HUD。

如果客户端保持空闲状态(您没有在一天的时间范围内领取奖励),剩余天数 UI 指示器将减少,表示您错过了一天。如果您错过了一天,您仍然可以领取前一天的奖励。

在此示例中,一个月有 31 天。如果您在当月领取了至少 28 天的奖励,您将有资格在活动结束前(最多 3 次,如果每天都按时领取)的每一天领取额外奖励。当活动结束(31 天过期)时,您可以关闭每日奖励窗口,然后点击右下角的每日奖励按钮开始新的活动。

设置

要求

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

角色
Addressables允许通过地址检索资产。
身份验证自动以匿名方式登录用户,以跟踪其服务器端数据。
云代码访问当前事件状态,领取每日奖励,并在月底重置功能以进行演示。它还会调用远程配置以确定用于每日奖励的参数(例如,授予哪些奖励以及数量)。
云存档存储和检索事件状态数据(例如,开始时间戳和成功领取的天数)。
部署为云服务提供一个连贯的接口来部署资产。
经济在运行时检索玩家的起始和更新货币余额,并直接接收来自云代码的授予奖励的请求。
远程配置定义每日奖励事件的参数。

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

Unity 云服务配置

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

  • 云代码脚本
  • 经济项目

要配置这些项目,您可以 使用部署包,或 使用 Unity 云控制台手动输入它们。推荐的最佳实践是使用部署包,因为它可以大大加快此过程。

使用部署包

要使用部署包部署配置

  1. 打开 部署窗口
  2. CommonDaily Rewards中选中。
  3. 点击Deploy Selection

这将部署所有必需的项目。

使用 Unity 云控制台

您可以使用 Unity 云控制台 通过项目和环境手动配置您的服务。请参阅以下部分以配置此示例。

云代码

在 Unity 云控制台中发布以下脚本

脚本参数描述项目中的位置
DailyRewards_GetStatus在启动时调用,以从云存档检索事件的当前状态,更新它,然后将其返回到客户端。Assets/Use Case Samples/Daily Rewards/Cloud Code/DailyRewards_GetStatus.js
DailyRewards_Claim响应奖励领取请求而调用,以验证资格、授予相应当天的奖励,然后更新云存档上的用户状态。Assets/Use Case Samples/Daily Rewards/Cloud Code/DailyRewards_Claim.js
DailyRewards_ResetEvent重置客户端上的每日奖励状态,以模拟新月份奖励的开始。Assets/Use Case Samples/Daily Rewards/Cloud Code/DailyRewards_ResetEvent.js

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

经济

在 Unity Cloud 仪表板中配置以下资源

资源类型资源名称ID描述
货币金币COIN一个可能填充日历的奖励。
货币宝石GEM一个可能填充日历的奖励。
货币星星STAR一个可能填充日历的奖励。
货币珍珠PEARL一个可能填充日历的奖励。

此示例还使用 Addressable Assets 来实现所有经济货币的精灵图标。作为开发者,您可以直接在经济仪表板中添加每个货币的 Addressables 地址,然后在运行时检索它,而无需更改代码。例如,如果您想通过更改仪表板中的地址来替换节日主题的精灵,而不是更新您的应用程序,这将非常有用。要为每种货币执行此操作

  1. 选择您要编辑的货币。
  2. 自定义数据下,单击加号 (+) 图标以添加自定义 JSON 脚本。
  3. 添加spriteAddress值,以及相应的 Addressable 地址字符串,如以下示例所示

自定义金币数据

{ 
  "spriteAddress": "Sprites/Currency/Coin" 
}

自定义宝石数据

{ 
  "spriteAddress": "Sprites/Currency/Gem" 
}

自定义星星数据

{ 
  "spriteAddress": "Sprites/Currency/Star" 
}

自定义珍珠数据

{ 
  "spriteAddress": "Sprites/Currency/Pearl" 
}

此配置允许服务确定每个货币的 Addressable 地址并使用正确的精灵初始化所有图标。稍后,当应用程序需要图标时(例如,在显示领取每日奖励所获得的货币时),它使用该货币的 ID 作为字典键来快速查找关联的精灵。

此功能发生在示例的EconomyManager.cs脚本中,在InitializeCurrencySprites方法(在启动时调用以使用所有货币图标初始化字典)和GetSpriteForCurrencyId方法(查找货币 ID(例如COIN)以查找关联的精灵)。