mcpField
R
remix-shop-items

remix-shop-items

github.com/farworld-labs开发61 次安装
代码仓库

关于 remix-shop-items

remix-shop-items 是面向 Remix 平台游戏开发者的商店物品管理工作流技能,涵盖物品生命周期操作及 RemixSDK 集成,并说明如何处理购买状态。

主要功能

  1. 01查找并复用游戏 ID
  2. 02操作前列出已有物品
  3. 03创建、更新和删除物品
  4. 04指导 RemixSDK 商店集成
  5. 05处理购买回调与库存

适用场景

  1. 01为游戏添加消耗品购买
  2. 02更新物品价格或名称
  3. 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 必须提供 bitsCost
  • TIER_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。

评论

支持 Markdown