虚拟商店

虚拟商店是大多数免费游戏中的一个关键功能。它们允许玩家在游戏环境中购买物品和交换资源,以促进游戏内的经济。当作为核心游戏循环的一部分正确实施时,它们可以驱动玩家参与度,并为玩家提供表达他们独特的游戏风格的机会。

先决条件

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

概述

要查看此用例的实际效果

  1. 在 Unity 编辑器项目窗口中,选择**Assets** > **Use Case Samples** > **Virtual Shops**,然后双击VirtualShopsSample.unity打开示例场景。
  2. 进入播放模式以与用例交互。

在启动时,此场景读取虚拟商店用例示例的远程配置以及所有必需的虚拟购买。它为所有货币和库存物品设置精灵,以便在商店显示中使用,用正确的数值初始化货币 HUD,并将第一个类别的虚拟购买展示给玩家购买。

初始化

当场景加载时,VirtualShopsSceneManager.cs脚本执行以下初始化任务

  1. 初始化 Unity 游戏服务。

  2. 使用身份验证服务匿名登录玩家。如果您之前已初始化任何其他示例场景,身份验证将使用您的缓存玩家 ID,而不是创建新的 ID。

  3. 从经济服务中检索并更新玩家的货币余额。

  4. 查询远程配置服务以获取虚拟商店配置数据。这包括

    1. 来自 Addressables 服务的货币和库存物品精灵,以便它们可以在商店 UI 中显示。
    2. 用于商店的虚拟购买交易。远程配置数据决定将每个交易放在哪个类别中,以及使用哪个图标。
  5. 客户端根据远程配置数据更新商店 UI。

功能

库存按钮

右上角的库存按钮会打开一个弹出窗口,显示所有当前拥有的库存物品。使用它来确认已购买的物品已正确添加到您的库存中。请注意,库存物品以随机顺序显示,因此新购买的物品可能会出现在列表中间。

获取货币调试按钮

右上角的**+30**金币按钮用于添加货币以进行测试。

虚拟购买

商店界面显示出售的物品及其相应的成本。点击任何物品,通过经济服务尝试进行虚拟购买。一个弹出窗口将出现,以确认购买成功或失败。

**注意**:大多数游戏会禁用用户无法支付的购买按钮。但是,此示例允许您尝试所有购买,无论是否支付,以方便测试经济服务如何验证虚拟购买。

类别按钮

您可以通过点击购买网格左侧的选项卡来更改购买类别。在**货币**、**物品**和**IAP**之间进行选择,以显示由远程配置 JSON 指定的相应购买列表。

**注意**:此示例目前不提供**IAP**类别。

后退按钮

按下左上角的后退按钮,将返回到“入门”场景。

设置

要求

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

角色
Addressables允许开发人员通过其地址请求资源。无论资源位于何处(本地或远程),系统都会找到它及其依赖项,然后返回它。
分析发送事件,使您能够跟踪玩家的游戏内交互、留存率以及您可以用来分析和改进游戏体验的其他信息。
身份验证自动匿名登录用户,以跟踪服务器端的数据。
部署为云服务提供一个连贯的界面来部署资源。
经济跟踪玩家的货币和库存物品,以及所有货币、库存物品和虚拟购买交易的定义。货币和库存物品都包含自定义数据,以识别在商店中使用的哪个图标精灵。
远程配置提供键值对,其中映射到给定键的值可以在服务器端更改,无论是手动更改还是基于特定游戏覆盖更改。SHOPS_CONFIG 条目存储所有虚拟购买交易的详细信息,以便在每个类别中可用。

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

Unity 云服务配置

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

  • 经济物品
  • 远程配置值

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

使用部署包

要使用部署包部署配置

  1. 打开部署窗口
  2. 选中CommonVirtual Shop
  3. 点击Deploy Selection

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

使用 Unity 云控制台

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

经济

在 Unity 云控制台中配置以下资源

资源类型资源项目ID自定义数据 *描述
货币金币COIN
{
	"spriteAddress": "Sprites/Currency/Coin"
}
您可以在虚拟商店中花费和购买的货币。
货币宝石GEM
{
	"spriteAddress": "Sprites/Currency/Gem"
}
您可以在虚拟商店中花费的货币。
货币珍珠PEARL
{
	"spriteAddress": "Sprites/Currency/Pearl"
}
您可以在虚拟商店中购买的货币。
货币星星STAR
{
	"spriteAddress": "Sprites/Currency/Star"
}
您可以在虚拟商店中购买的货币。
库存物品SWORD
{
	"spriteAddress": "Sprites/Currency/Sword"
}
您可以在虚拟商店中购买的物品。
库存物品盾牌SHIELD
{
	"spriteAddress": "Sprites/Currency/Shield"
}
您可以在虚拟商店中购买的物品。

* 此示例使用 Addressable Assets 来实现所有经济资源的精灵图标。作为开发人员,您可以将每个货币的图标的 Addressables 地址直接添加到经济控制台中,然后在运行时检索它,而无需更改您的代码。例如,如果您想通过更改控制台中的地址来更新货币图标,而不是更新您的应用程序,这将非常有用。要为每个资源执行此操作

  1. 选择要编辑的货币。
  2. 在**自定义数据**下,点击加号 (**+**) 图标以添加自定义 JSON 脚本。
  3. 添加spriteAddress值,以及表格中列出的相应 Addressable 地址字符串。

当客户端需要初始化精灵(例如,在商店中显示每个虚拟购买的成本和奖励)时,资源的 ID 充当字典键,可以快速找到相关的精灵。客户端在启动时调用 AddressablesManager.cs 脚本的 PreloadAllEconomySprites() 方法,使用所有图标精灵初始化字典,preloadedSpritesByEconomyId 字典用于查找经济 ID 以找到与商店显示中使用的相关精灵。

此外,为商店配置以下虚拟购买

商品名称ID此购买获得此购买花费
1 把剑换硬币1_SWORD_FOR_COINS剑 (1)硬币 (15)
2 把剑换硬币2_SWORD_FOR_COINS剑 (2)硬币 (25)
3 把剑换硬币3_SWORD_FOR_COINS剑 (3)硬币 (30)
1 个盾牌换硬币1_SHIELD_FOR_COINS盾牌 (1)硬币 (10)
2 个盾牌换硬币2_SHIELD_FOR_COINS盾牌 (2)硬币 (15)
3 个盾牌换硬币3_SHIELD_FOR_COINS盾牌 (3)硬币 (20)
100 个硬币换宝石100_COIN_FOR_GEMS硬币 (100)宝石 (7)
250 个硬币换宝石250_COIN_FOR_GEMS硬币 (250)宝石 (15)
1000 个硬币换宝石1000_COIN_FOR_GEMS硬币 (1000)宝石 (25)
1 星星换硬币1_STAR_FOR_COINS星星 (1)硬币 (25)
3 颗珍珠换硬币3_PEARL_FOR_COINS珍珠 (3)硬币 (50)

远程配置

在 Unity Cloud Dashboard 中设置以下配置值

类型描述
SHOP_CONFIGJSON包含有关虚拟购买及其在商店中显示位置的信息。请参阅以下 JSON 代码段。

SHOP_CONFIG JSON 值

{
	"categories": [{
    	"id": "Items",
        "enabledFlag": true,
        "items": [{
        	"id": "1_SWORD_FOR_COINS"
        }, {
        	"id": "2_SWORD_FOR_COINS",
            "color": "#FFFFFFFF",
            "badgeIconAddress": ""
        }, {
        	"id": "3_SWORD_FOR_COINS",
            "color": "#FFFFFFFF",
            "badgeIconAddress": ""
        }, {
        	"id": "1_SHIELD_FOR_COINS",
            "color": "#FFFFFFFF",
            "badgeIconAddress": ""
        }, {
        	"id": "2_SHIELD_FOR_COINS",
            "color": "#FFFFFFFF",
            "badgeIconAddress": ""
        }, {
        	"id": "3_SHIELD_FOR_COINS",
            "color": "#FFFFFFFF",
            "badgeIconAddress": "Sprites/Badges/Banner",
            "badgeColor": "#FF0000FF",
            "badgeText": "Best Value",
            "badgeTextColor": "#FFFFFFFF"
        }]
	}, {
    	"id": "Currencies",
        "enabledFlag": true,
        "items": [{
        	"id": "100_COIN_FOR_GEMS",
            "color": "#FFFFFFFF",
            "badgeIconAddress": ""
		}, {
        	"id": "250_COIN_FOR_GEMS",
            "color": "#FFFFFFFF",
            "badgeIconAddress": ""
        }, {
        	"id": "1000_COIN_FOR_GEMS",
            "color": "#FFFFFFFF",
            "badgeIconAddress": "Sprites/Badges/Banner",
            "badgeColor": "#FF0000FF",
            "badgeText": "Best Value",
            "badgeTextColor": "#FFFFFFFF"
        }, {
        	"id": "1_STAR_FOR_COINS",
            "color": "#FFFFFFFF",
            "badgeIconAddress": ""
        }, {
        	"id": "3_PEARL_FOR_COINS",
            "color": "#FFFFFFFF",
            "badgeIconAddress": ""
        }]
	}, {
    	"id": "IAP",
        "enabledFlag": false,
        "items": []
    }]
}