Skip to main content
Economy v2 现已正式发布。如需支持和反馈,请访问 PlayFab 论坛
Economy v1 (Legacy) 有一个内置的 Drop Tables 功能,可让你直接在 Game Manager 中定义加权随机物品分布。Economy v2 不包括掉落表作为原生功能,但你可以使用 Azure Functions 结合 ExecuteInventoryOperations API 实现相同的行为——并具有更多的灵活性。 本教程向你介绍如何构建一个完整的随机战利品系统,其功能是:
  • Title Data 中使用加权物品池定义战利品表。
  • 使用 Azure Function 从战利品表中滚出随机物品。
  • 在单个调用中原子地扣除容器令牌并授予随机选择的物品。

工作原理

  1. 在 Title Data 中定义战利品表:将掉落表配置(物品 ID、权重、数量)作为 JSON 存储在 Title Data 中,这样你就可以更新它们而无需重新部署代码。
  2. 将容器表示为虚拟货币:使用与固定内容容器相同的容器令牌模式:一种作为未打开的战利品箱的虚拟货币。
  3. 调用 Azure Function 来打开容器:函数读取战利品表,运行加权随机选择,然后调用 ExecuteInventoryOperations 原子地扣除 1 个容器令牌并添加随机选择的物品。

先决条件

步骤 1:在 Title Data 中定义战利品表

Title Data 中存储战利品表定义,以便设计师可以在没有代码更改的情况下更新掉落率。

战利品表结构示例

创建一个名为 LootTables 的 Title Data 键,其 JSON 值为:
每个战利品表包括以下属性:

设置 Title Data

Game Manager

  1. 转到 Content > Title Data
  2. 创建一个名为 LootTables 的键。
  3. 将你的 JSON 战利品表配置粘贴为值。
  4. 选择 Save

API

使用 SetTitleData

步骤 2:创建 Azure Function

创建一个 Azure Function,当玩家想要打开容器时你的游戏客户端调用它。此函数:
  1. 验证玩家至少拥有一个容器令牌。
  2. 从 Title Data 读取战利品表。
  3. 运行加权随机选择。
  4. 调用 ExecuteInventoryOperations 原子地扣除令牌并授予奖励。

数据模型

加权随机选择

完整的 Azure Function

GetContainerCurrencyId 帮助函数将战利品表名称映射到其相应的容器货币 ID。你可以将此映射与战利品表一起存储在 Title Data 中,或使用命名约定。

步骤 3:向玩家授予容器令牌

通过游戏玩法、商店购买或奖励向玩家授予容器令牌。使用 带有固定内容的容器 中描述的相同方法。

步骤 4:从你的游戏客户端调用函数

当玩家想要打开容器时,通过使用 ExecuteFunction 调用 Azure Function:
响应包含随机选择的奖励:

战利品表设计模式

稀有度层级

具有指数递减权重的经典稀有度系统:
掉落概率:
  • Common: ~90.0%
  • Uncommon: ~9.0%
  • Rare: ~0.9%
  • Legendary: ~0.09%

多次滚动与混合奖励

一个补给箱,从混合池中给出三个随机物品:

保底 + 随机(保底系统)

对于”每 10 次打开保底稀有或更好”的模式,在显示属性玩家数据 中跟踪玩家的打开次数,并在达到阈值时在 Azure Function 中覆盖随机选择。

嵌套掉落表

一个战利品表可以按 ID 引用另一个战利品表。你的 Azure Function 递归地解析引用:
函数检查 ItemId 是否以 TABLE: 开头,如果是,则在引用的表上滚动,而不是直接授予物品。

安全注意事项

  • 始终在服务器端运行战利品逻辑,在 Azure Function 中。永远不要相信客户端来确定滚出了哪些物品。此方法可防止操纵。
  • 使用 IdempotencyIdExecuteInventoryOperations 调用上,以防止如果函数被重试时的重复授予。有关更多信息,请参见 幂等交易和重试
  • 通过在扣除之前检查玩家的库存来验证容器所有权。如果玩家没有足够的令牌,ExecuteInventoryOperations 中的 Subtract 操作将失败,这会回滚整个批处理。
  • 记录所有滚动用于审计。函数的返回值和 PlayStream 事件提供了每个玩家收到内容的记录。

另请参阅

最后修改于 2026年8月13日