Economy v2 现已正式发布。如需支持和反馈,请访问 PlayFab 论坛。
- 在 Title Data 中使用加权物品池定义战利品表。
- 使用 Azure Function 从战利品表中滚出随机物品。
- 在单个调用中原子地扣除容器令牌并授予随机选择的物品。
工作原理
- 在 Title Data 中定义战利品表:将掉落表配置(物品 ID、权重、数量)作为 JSON 存储在 Title Data 中,这样你就可以更新它们而无需重新部署代码。
- 将容器表示为虚拟货币:使用与固定内容容器相同的容器令牌模式:一种作为未打开的战利品箱的虚拟货币。
- 调用 Azure Function 来打开容器:函数读取战利品表,运行加权随机选择,然后调用
ExecuteInventoryOperations原子地扣除 1 个容器令牌并添加随机选择的物品。
先决条件
- 一个 PlayFab 开发者账户。
- 在 Game Manager 中创建的 title。
- 已发布的目录物品,你可以作为战利品奖励授予。
- 代表容器的虚拟货币(有关设置说明,请参见 带有固定内容的容器)。
- 一个连接到你的 PlayFab title 的 Azure Functions 项目。
步骤 1:在 Title Data 中定义战利品表
在 Title Data 中存储战利品表定义,以便设计师可以在没有代码更改的情况下更新掉落率。战利品表结构示例
创建一个名为LootTables 的 Title Data 键,其 JSON 值为:
设置 Title Data
Game Manager
- 转到 Content > Title Data。
- 创建一个名为
LootTables的键。 - 将你的 JSON 战利品表配置粘贴为值。
- 选择 Save。
API
使用 SetTitleData:步骤 2:创建 Azure Function
创建一个 Azure Function,当玩家想要打开容器时你的游戏客户端调用它。此函数:- 验证玩家至少拥有一个容器令牌。
- 从 Title Data 读取战利品表。
- 运行加权随机选择。
- 调用
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 中。永远不要相信客户端来确定滚出了哪些物品。此方法可防止操纵。
- 使用
IdempotencyId在ExecuteInventoryOperations调用上,以防止如果函数被重试时的重复授予。有关更多信息,请参见 幂等交易和重试。 - 通过在扣除之前检查玩家的库存来验证容器所有权。如果玩家没有足够的令牌,
ExecuteInventoryOperations中的Subtract操作将失败,这会回滚整个批处理。 - 记录所有滚动用于审计。函数的返回值和 PlayStream 事件提供了每个玩家收到内容的记录。
