实验 使您能够在游戏内和匹配中进行 A/B 测试,以测量对游戏变化的因果影响。例如,您可以向不同的玩家展示不同的入门体验,并测量游戏时间、留存率和其他关键绩效指标的差异。
实验非常适合测量以下内容:
- 参与度 - 入门流程、进度系统、控制方案、自定义匹配
- 货币化 - 商店可见性和用户体验、起始包类型、定价

创建实验
实验分为两种类型:
如果您还没有 配置,为您的游戏创建一个。
在 创作者中心 的 实验 页面上,点击 创建实验。
对于 类型,选择 游戏内。
指定实验的名称、目标指标和计划持续时间。实验持续 14 到 60 天。
无论您选择哪个目标指标,实验都会跟踪列表中的所有 指标。
选择一个百分比推出。这是您希望包含在实验中的玩家百分比。
通常来说,包含的玩家越多,数据越好,但请根据您的游戏判断什么是最好的。
指定变体和百分比。
变体是您配置的替代值。对于控制值为 500 的数值配置键 bossHealth,您可以指定一个 300 的变体。您可以在实验中有最多 两个变体 和一个控制。
百分比决定如何在 实验推出 内分配变体。考虑以下示例:
- 您选择了 40% 的整体推出。
- 您指定了两个变体,并在它们和控制之间进行了 50/50 的切分。
在这个示例中,60% 的用户被排除在实验之外;这些用户接收控制,并且对实验结果没有影响。约 20% 的用户作为实验的一部分接收控制。另有 20% 接收变体。根据您的玩家数量,这种分配可能不足以产生可操作的结果。

最后一步是调度。您可以立即开始实验或将其调度到未来的日期和时间。在您调度实验后,无法更改其配置(持续时间、推出百分比、变体等),但您可以重新调度。
指标
实验在实验持续期间跟踪以下所有指标。
| 指标 | 描述 |
|---|---|
| D1 留存率 | 一天后返回您游戏的玩家百分比。 |
| D7 留存率 | 一周后返回您游戏的玩家百分比。 |
| 游戏时间 | 玩家在您的游戏中花费的平均时间。累计计算。 |
| ARPU | 每用户的平均收入。收入除以玩家人数。累计计算。 |
| ARPPU | 每个支付用户的平均收入。收入除以购买游戏相关物品的玩家人数。累计计算。 |
| 付费转化率 | 购买游戏相关物品的玩家百分比。 |
| 会话时间 | 游戏时间除以会话数量。累计计算。 |
实验状态
实验 页面显示实验的以下状态。
| 状态 | 描述 |
|---|---|
| 完成 | 实验已经结束,这可能是在您手动停止时,当您达到决策时,或者在决策日期后不久自动结束(游戏内实验在 14 天后,匹配实验立即结束)。您仍然可以查看详细信息和结果。 |
| 需要决策 | 实验已到达决策日期。现在是审查结果的好时机。 |
| 运行中 | 实验正在进行,但尚未达到决策日期。 |
| 已调度 | 实验计划在未来的日期开始。 |
| 草稿 | 实验尚未开始或调度。您可以完成设置。 |
将实验添加到您的代码
应用游戏内实验类似于 应用配置。主要区别在于使用 ConfigService:GetConfigForPlayerAsync() 而不是 ConfigService:GetConfigAsync()。
GetConfigForPlayerAsync() 检索玩家特定的快照。当您调用 GetValue() 时,快照会检查是否有活动实验,并根据推出百分比对用户进行注册(或不注册)。
local ConfigService = game:GetService("ConfigService")
local Players = game:GetService("Players")
local function onPlayerAdded(player)
local playerConfig = ConfigService:GetConfigForPlayerAsync(player)
local leaderboardColor = playerConfig:GetValue("leaderboardColor")
end
Players.PlayerAdded:Connect(onPlayerAdded)
您必须分别为每个玩家调用 GetConfigForPlayerAsync();GetConfigAsync() 不适用于实验。
在您对玩家特定快照调用 GetValue() 后,与快照相关的玩家仅在该键的实验中注册。这种方法的所有后续调用在实验期间返回相同的控制或变体。只有第一次调用是随机的。
注册实验不限于新用户。即使用户之前从 GetConfigAsync() 中获得了一个值,您仍然可以使用来自 GetConfigForPlayerAsync() 的玩家特定快照将他们注册到实验中。
如果玩家特定快照中的键没有活动实验,GetValue() 将返回标准配置值(如果没有值则返回 nil)。
定向注册
如果您想针对满足特定条件的部分玩家,您需要编写额外的代码来检查这些条件,然后再调用 GetValue() 来注册他们参加实验。考虑以下示例:
- 您想在游戏中测试新的控制方案。
- 您不想包括现有玩家(他们可能已习惯于现有方案),只想包括新玩家。
您的代码可能如下所示:
local function getControlScheme(player, racesCompleted)
if racesCompleted > 0 then
return "standardScheme"
else
-- 玩家是新的,注册到实验
local playerConfigSnapshot = ConfigService:GetConfigForPlayerAsync(player)
if playerConfigSnapshot:GetValue("useNewControlScheme") then
return "newScheme"
else
return "standardScheme"
end
end
end
如果您希望控制方案在后续会话中持续存在,您可能需要向玩家在数据存储中的条目添加一个值。
查看和解释结果
实验运行至少 24 小时后,点击 查看 以查看详细信息和结果。

您可以看到注册的玩家总数,以及收到控制值和每个变体的玩家数量。尽早查看此页面对于确保实验正常运行是有用的,但不用于采取行动。在采取行动之前,请参阅 最佳实践。
实验完成后,检查 结果 标签。寻找目标指标的统计显著性变化,仪表板会以绿色或红色突出显示这些变化。这些变化更可能显示您的变体影响,并且不太可能是假阳性或假阴性。

将鼠标悬停在任何指标上以查看 查看置信度 按钮,该按钮显示置信区间。
当其百分比变化的置信区间不与 0% 重叠时,指标就具有统计显著性。在下面的示例中,D1 留存率上升了 17.4%,下限和上限分别为 8.02% 和 22.03%,这使得这个变化具有统计显著性。

为了方便起见,结果页面允许您用实验中的一个变体替换默认配置值。点击 做决策 以选择变体,或点击 更改赢家 如果您改变主意。如果您再次返回 配置 页面,您应该看到新值。
实验的最佳实践
使用最小可检测效果 (MDE) 来决定您的实验是否值得进行。
Roblox 使用您的目标指标和每个变体的玩家人数计算 MDE,这基于每日活跃用户、推出百分比、实验持续时间和变体分割。如果目标指标的 MDE 太高(例如,超过 100%),您不太可能达到统计显著性。每日活跃用户少于 1000 的游戏可能会很难从实验中获得有用数据。

从假设开始。 不要仅仅改变一个变量然后检查结果,而是写一个关于您改变了什么、预期会发生什么以及为什么的因果关系声明。随着实验次数的增加,拥有一组书面的假设可以帮助您澄清思路并激发新的实验想法。
让实验运行其完整的持续时间。 新颖效应(对一种变化的暂时兴趣并不是因为它更好,而是因为它是新的)会严重扭曲早期结果,有时导致它们在统计显著性之间波动。提前结束实验会增加您因异常峰值而采取过早行动的可能性,而更多的数据可以平滑这些峰值甚至与之相矛盾。
在没有统计显著性的情况下不要采取行动。 即使似乎很大的玩家行为变化可能不是统计显著性的,这通常是由于样本量小。如果变化不显著,请忽视它。
在实验期间避免更改。当然,重大错误需要修复,但对游戏内容的更改可能会影响玩家行为并无效化您的结果,即使这些改动 看似 与您的实验无关。类似地,仅在您有信心它们不会相互影响时同时运行实验。
使用置信区间深入分析 指标,并检查统计显著性的边缘案例。如果置信区间过宽,指标可能永远无法达到统计显著性。
如果一个指标显著上升而另一个显著下降,您必须 决定这种权衡是否值得,可能与其他统计显著的变化结合考虑。
实验提供了强信号,但 统计显著性处理的是概率,而不是确定性—因此有置信区间。数据变异性、样本大小和变化的幅度都影响检测变体是否影响玩家行为的概率。您根据实验结果采取的任何行动都应与定性数据(如玩家反馈)及您对游戏的整体愿景相平衡。
记录您的发现和决策。 即使您不使用它们来进行额外的实验,拥有一套知识和证据也可以为您设计游戏提供启发。