关于 remix-shop-items
remix-shop-items 是面向 Remix 平台游戏开发者的商店物品管理工作流技能,涵盖物品生命周期操作及 RemixSDK 集成,并说明如何处理购买状态。
主要功能
- 01查找并复用游戏 ID
- 02操作前列出已有物品
- 03创建、更新和删除物品
- 04指导 RemixSDK 商店集成
- 05处理购买回调与库存
适用场景
- 01为游戏添加消耗品购买
- 02更新物品价格或名称
- 03创建物品前检查现有状态
MCP 相关
该技能建议尽可能使用官方 CLI 或 MCP 工具链。通过 MCP 使用时,若符合条件的物品未提供 `iconUrl`,`createShopItem` 可生成图标。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ farworld-labs/ remix-skills --skill remix-shop-items安装后在 Claude Code 中输入/remix-shop-items确认已加载。
详细介绍
管理商店物品工作流
概述
本技能将指导你在 Remix 平台上为游戏创建、管理和集成商店物品。
前提条件
- 游戏必须已存在。
- 优先使用任务上下文中的
gameId,然后是.remix-cli.json,再然后是可用时的旧版.remix-mcp.json。 - 尽可能使用官方 CLI 或 MCP 工具链,而不是手写 HTTP 请求。
步骤
1. 检查现有游戏 ID
首先读取任务上下文或之前的工具结果。否则,读取当前目录中的 .remix-cli.json
或旧版 .remix-mcp.json。如果其中任一文件存在且包含 gameId,则使用该值。
只有在两个文件都不存在或都没有 gameId 时,才应遵循 upload-game 工作流来创建一个。
2. 管理商店物品
列出所有物品
始终先列出当前物品,以便复用正确的 itemId、避免重复的 slug,并确认物品是否已处于 PENDING、ACTIVE 或 INACTIVE 状态。
创建物品
POST https://api.remix.gg/v1/games/{gameId}/items
Authorization: Bearer $REMIX_API_KEY
Content-Type: application/json
{
"name": "Extra Life",
"slug": "extra-life",
"itemType": "CONSUMABLE",
"bitsCost": 50,
"description": "Spend one to restore a life after game over.",
"iconUrl": "https://asset-url.png"
}
itemType为CONSUMABLE、ONE_TIME或TIER_UNLOCK之一CONSUMABLE和ONE_TIME必须提供bitsCostTIER_UNLOCK必须提供tier- 新物品的初始状态为
PENDING - 使用 MCP 时,如果
CONSUMABLE或ONE_TIME未提供iconUrl,createShopItem可以自动生成图标
更新物品
POST https://api.remix.gg/v1/games/{gameId}/items/{itemId}
Authorization: Bearer $REMIX_API_KEY
Content-Type: application/json
{ "bitsCost": 75, "name": "Extra Life Pack" }
接受部分请求体——只需包含你想更改的字段。
删除物品
DELETE https://api.remix.gg/v1/games/{gameId}/items/{itemId}
Authorization: Bearer $REMIX_API_KEY
3. 在游戏代码中集成商店物品
将 RemixSDK 商店集成添加到游戏中:
const sdk = window.RemixSDK
await sdk.ready()
function getConsumableBalance(slug, spentKey) {
const purchased = sdk.getItemPurchaseCount(slug)
const spent = Number(sdk.gameState?.[spentKey] || 0)
return Math.max(0, purchased - spent)
}
async function buyExtraLife() {
const result = await sdk.purchase({ item: 'extra-life' })
if (!result.success) showPurchaseError()
}
sdk.onPurchaseComplete(({ success, item }) => {
if (!success || item !== 'extra-life') return
const currentState = sdk.gameState || {}
const spent = Number(currentState.extraLivesSpent || 0)
sdk.singlePlayer.actions.saveGameState({
gameState: {
...currentState,
extraLivesSpent: Math.max(0, spent - 1),
},
})
})
错误做法
请勿进行以下操作:
-
未监听
onPurchaseComplete就发放物品。 始终等待回调后再向玩家发放任何物品。购买可能失败或被取消。 -
在新代码中使用
singlePlayer.actions.purchase(...)。 请调用sdk.purchase({ item: 'slug' })。 -
使用
localStorage跟踪购买记录。 平台会处理购买状态。请使用hasItem()、getItemPurchaseCount()、inventory和shopItems。 -
在游戏状态中硬编码价格或物品元数据。 从平台读取物品元数据,并且只在
gameState中持久化使用计数器。
提示
- 可重复购买的物品使用
CONSUMABLE,永久解锁使用ONE_TIME,进度类物品使用TIER_UNLOCK。 - 即使你也等待了
sdk.purchase(...),仍要调用sdk.onPurchaseComplete(...)。 - 当游戏需要获取当前价格或图标元数据时,请使用
sdk.getShopItem(slug)或sdk.shopItems。