A/B 测试

A/B 测试是一个强大的工具,可以用来测试不同变量对不同用户群体的并行影响,以查看哪个变量对游戏的影响最大。A/B 测试对于微调留存率、货币化或平衡机制非常有用。此示例模拟了一个 A/B 测试,以评估升级所需多少经验值。

先决条件

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

概述

要查看此用例的实际运行情况,打开示例菜单,然后导航到**AB 测试关卡难度**。要直接打开此场景并与用例交互

  1. 在 Unity 编辑器**项目**窗口中,选择**Assets** > **Use Case Samples** > **AB Test Level Difficulty**,然后双击 ABTestLevelDifficultySample.unity 打开示例场景。
  2. 按**播放**进入播放模式。

玩家登录后,屏幕会显示他们的等级和 XP 计,跟踪他们的当前 XP 和升级所需的总 XP 量。在本例中,升级所需的总 XP 量为 100、80、60、50 或 30,具体取决于玩家随机分配到的哪个测试组。为了诊断目的,玩家的测试组也会显示(A、B、C、D 或 E)。

初始化

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

  1. 初始化 Unity 服务。
  2. 向分析服务发送 SceneOpened 自定义事件。这与 SceneSessionLength 自定义事件(当您单击场景的返回按钮时发送)一起跟踪玩家的会话时长,作为您如何实施分析以评估测试结果的示例。
  3. 使用身份验证服务 匿名 登录玩家。如果您之前已初始化任何其他示例场景,身份验证将使用您的缓存玩家 ID 而不是创建新的玩家 ID。如果没有,您的初始等级(1)和 XP(0)将保存在云存档中,而不是加载现有数据。
  4. 从经济服务检索并更新玩家的货币余额。
  5. 查询远程配置服务以获取相应的测试组名称和相应的升级所需 XP 阈值。

所有这些更新的数据都显示在场景中,**获得 XP** 按钮变得可交互。

功能

获得 XP

当您单击**获得 XP** 按钮时,模拟玩家会获得 10 XP。当 XP 条满(根据测试组阈值)时,模拟玩家升级并获得货币。将发生以下情况

  1. 按钮的 OnClick 方法向分析服务发送 ActionButtonPressed 自定义事件,并调用云代码 GainXPAndLevelIfReady.js 脚本。

  2. 此服务器权威调用从云存档和远程配置服务获取玩家信息,将 XP 增加远程配置中指定的金额(在本例中为 10),然后测试新的玩家 XP 总数是否等于或超过升级阈值。

    • 如果玩家没有升级,他们的新 XP 将保存在云存档中并返回给客户端,客户端会更新值并显示指示 XP 增加多少的文本。
    • 如果玩家升级了,它会调用经济服务以分发升级奖励(在本例中为 100 个金币),并调用云存档以保存增加的玩家等级和新的玩家 XP,然后将该信息返回给客户端代码。
  3. 客户端代码打开升级对话框并在场景 UI 中更新相关数据。请注意,此步骤提供了一个机会,可以让玩家根据他们的细分显示不同的美术作品,也是在运行时检索特定货币的附加数据的便捷方法。

注意:在本例中,位于远程配置中的交叉引用字典在启动时初始化,将奖励的货币 ID(在本例中为 COIN)转换为 Addressables 地址,您可以使用它来显示精灵(在本例中为 Sprites/Currency/Coin)。根据玩家的细分显示不同美术作品的更简单方法是,将附加信息附加到经济配置数据中货币关联的自定义数据。但是,这里将数据添加到活动中,以演示远程配置服务的灵活性。

以新玩家身份登录

单击**以新玩家身份登录**以模拟一个新的玩家,该玩家具有一个新的随机分配的测试组,该组从 0 XP 开始。将发生以下情况

  1. 按钮的 OnClick 方法会删除当前的匿名玩家 ID,将所有缓存的值重置为它们的空值或默认值,然后使用身份验证服务启动新的登录,该登录遵循场景首次加载时的相同流程。
  2. 与**获得 XP** 按钮一样,它向分析服务发送 ActionButtonPressed 自定义事件。
  3. 每次单击**以新玩家身份登录**按钮时,身份验证服务都会创建一个新的匿名玩家 ID,远程配置服务会为该 ID 分配一个新的 A/B 测试组。

返回按钮

如果您按下返回按钮(场景左上角的箭头)以返回“从这里开始”或示例菜单场景,它将触发 SceneSessionLength 自定义分析事件,该事件将捕获在此场景中花费的时间。

设置

要求

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

作用
分析发送跟踪玩家游戏内交互、留存率指标和其他信息供您分析和改进游戏体验的事件。
身份验证自动将玩家作为匿名用户登录,以跟踪其服务器端数据。
云代码存储用于增加 XP 和服务器端升级玩家的验证逻辑。
云存档提供一种服务器权威的方式来保存玩家数据和游戏状态。在本例中,该服务存储玩家的等级和 XP。
部署为云服务提供一致的界面来部署资产。
经济在运行时检索起始和更新的货币余额。
游戏覆盖根据请求的分配值将玩家分配到不同的组。玩家根据他们所在的组接收不同的升级所需 XP 配置。
远程配置提供您可以手动或根据特定游戏覆盖在服务器端映射和更改的键值对。还存储与货币图标 Addressables 地址关联的数据。

注意:虽然它被列为一个包,并且需要单独的仪表板配置,但游戏覆盖实际上没有从包管理器安装的 SDK。它是一个服务器端产品,它会影响从其他服务返回的值。

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

Unity 云服务配置

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

  • 云代码脚本
  • 经济项目
  • 远程配置值
  • 远程配置游戏覆盖
  • 分析服务的自定义事件和参数

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

使用部署包

要使用部署包部署配置

  1. 打开 部署窗口
  2. 选中 CommonAB Test Level Difficulty
  3. 单击 Deploy Selection

这将部署以下项目

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

部署包不支持以下项目

  • 远程配置游戏覆盖
  • 分析服务的自定义事件和参数

要配置它们,请参考 使用 Unity 云仪表板

使用 Unity 云控制台

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

分析

重要:此示例演示了触发分析事件所需的代码。但是,可能需要额外的代码才能满足法律要求,例如 GDPR、CCPA 和 PIPL。有关更多信息,请参阅有关 管理数据隐私 的文档。

配置 并启用以下自定义分析事件

事件名称描述自定义参数
SceneOpened每次加载场景时发送。- sceneName
ActionButtonPressed每次单击场景中的按钮时发送。- abGroup
- buttonName
- buttonNameByABGroup
- buttonNameBySceneName
- buttonNameBySceneNameAndABGroup
- sceneName
SceneSessionLength用于指示加载场景和单击后退按钮之间的时间(实际上是玩家在场景中花费的时间)。在此示例中,您可以使用此数据了解每个测试组升级所需的实际时间。- abGroup
- sceneName
- timeRange
- timeRangeByABGroup
- timeRangeBySceneName
- timeRangeBySceneNameAndABGroup

配置以下自定义参数以支持您的自定义事件

参数名称类型描述
abGroupstring玩家分配到的 A/B 组和 A/B 测试 ID。字符串格式为 A/B 组名称 (A/B 测试 ID)
buttonNamestring玩家单击的按钮的名称。
buttonNameByABGroupstring将单击的按钮的名称与玩家的 A/B 组进行分组。字符串格式为 按钮名称 - A/B 组名称(A/B 测试 ID)
buttonNameBySceneNamestring将单击的按钮的名称与当前场景的名称进行分组。字符串格式为 按钮名称 - 场景名称
buttonNameBySceneNameAndABGroupstring将单击的按钮的名称与场景的名称和玩家的 A/B 组进行分组。字符串格式为 按钮名称 - 场景名称 - A/B 组名称(A/B 测试 ID)
sceneNamestring触发事件的场景的名称。
timeRangestring触发事件时在场景中花费的时间。
timeRangeByABGroupstring将触发事件时在场景中花费的时间与玩家的 A/B 组进行分组。字符串格式为 时间范围 - A/B 组名称(A/B 测试 ID)
timeRangeBySceneNamestring将触发事件时在场景中花费的时间与场景的名称进行分组。字符串格式为 时间范围 - 场景名称
timeRangeBySceneNameAndABGroupstring将触发事件时在场景中花费的时间与场景的名称和玩家的 A/B 组进行分组。字符串格式为 时间范围 - 场景名称 - A/B 组名称 (A/B 测试 ID)

注意:此扩展的潜在参数列表允许在 Unity 云控制台的 数据资源管理器 中对不同参数分组进行更灵活的分析。或者,您可以只发送未分组的参数(例如,buttonNamesceneName),并使用数据资源管理器中的数据导出功能按您想要的方式执行任何分组分析。

云代码

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

脚本参数描述项目中的位置
GainXPAndLevelIfReady增加玩家的 XP 并检查累计 XP 是否超过其 A/B 测试组定义的升级阈值。Assets/Use Case Samples/AB Test Level Difficulty/Cloud Code/GainXPAndLevelIfReady.js

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

经济

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

资源类型资源名称ID描述
货币硬币COIN作为玩家升级奖励分发的货币。

远程配置

在 Unity 云控制台中设置以下配置值

类型描述
A_B_TEST_GROUPstring玩家所属的测试用户组的标识符。空的默认值
A_B_TEST_IDstring为此用户正在积极运行的 AB 测试的标识符。空的默认值
LEVEL_UP_XP_NEEDEDint玩家升级所需的 XP 数量。100
XP_INCREASEint玩家每次获得 XP 时 XP 将增加的金额。10
CURRENCIESJSONcurrencyIdspriteAddresses 的所有货币类型的交叉引用。
json
{
	"currencyData": [{
    	"currencyId": "COIN",
        "currencySpec": {
        	"spriteAddress": "Sprites/Currency/Coin"
        }
	},{
    	"currencyId": "GEM",
        "currencySpec": {
        	"spriteAddress": "Sprites/Currency/Gem"
		}
	},{
		"currencyId": "PEARL",
        "currencySpec": {
			"spriteAddress": "Sprites/Currency/Pearl"
    	}
	},{
    	"currencyId": "STAR",
        "currencySpec": {
        	"spriteAddress": "Sprites/Currency/Star"
		}
	}]
}

游戏覆盖

在 Unity 云控制台中配置以下覆盖

详细信息将覆盖命名为“Level Difficulty A/B Test”。
目标选择目标为 100% 受众的受众
内容

选择选择内容类型 > 配置覆盖

为变体 1 输入以下键的覆盖值

  • A_B_TEST_GROUP: "A"
  • A_B_TEST_ID: "LevelDifficultyTest1"
  • LEVEL_UP_XP_NEEDED: 100

为变体 2 输入以下键的覆盖值

  • A_B_TEST_GROUP: "B"
  • A_B_TEST_ID: "LevelDifficultyTest1"
  • LEVEL_UP_XP_NEEDED: 80

为变体 3 输入以下键的覆盖值

  • A_B_TEST_GROUP: “C
  • A_B_TEST_ID: “LevelDifficultyTest1
  • LEVEL_UP_XP_NEEDED: 60

为变体 4 输入以下键的覆盖值

  • A_B_TEST_GROUP: “D
  • A_B_TEST_ID: “LevelDifficultyTest1
  • LEVEL_UP_XP_NEEDED: 50

为变体 5 输入以下键的覆盖值

  • A_B_TEST_GROUP: “E
  • A_B_TEST_ID: “LevelDifficultyTest1
  • LEVEL_UP_XP_NEEDED: 30
调度

设置以下开始日期和结束日期

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

完成创建游戏覆盖后,单击启用