创游世界商店系统实战设计指南
一句话摘要
本文讲解创游世界中商店系统的完整设计思路,涵盖商品数据结构、货币扣减、购买校验、库存刷新与UI展示,帮助你搭建可维护的商店、抽奖、兑换系统。
适合谁阅读
- 想做商店、抽奖、兑换系统的创作者
- 遇到商店数据混乱、UI不同步问题的开发者
- 想了解背包与商店如何共用数据结构的进阶用户
你将学到什么
- 商店系统的四层架构:商品定义层、玩家状态层、交易处理层、UI展示层
- 商品数据的正确存放位置
- 限购、刷新、折扣的常见实现思路
- 商店与背包的数据共用方案
- 常见错误与避坑建议
💡 如果你想快速查找商店问题,请查看:创游世界商店系统速查卡
1. 商店系统的核心问题
很多创作者在做商店时,会遇到以下问题:
- 商品价格到底放哪一层
- 购买后UI为什么没更新
- 金币扣了但背包没进货
- 限购、刷新、折扣这些逻辑应该怎么拆
- 商店页和背包页是不是要共用一套数据结构
这些问题归根结底是商店系统的架构没有分层清楚。
📚 相关阅读:脚本作用域与数据流深度研究 - 数据分层详解
2. 推荐的四层架构
2.1 商品定义层
负责定义商品本身的信息,与玩家状态无关。
| 字段 | 说明 | 存放位置 |
|---|---|---|
| 商品ID | 唯一标识 | 配置表 |
| 名称 | 商品名称 | 配置表 |
| 描述 | 商品说明 | 配置表 |
| 价格类型 | 金币/钻石/券/材料 | 配置表 |
| 价格数值 | 具体价格 | 配置表 |
| 购买产出 | 获得什么、多少数量 | 配置表 |
| 限购规则 | 无限购/每日限购/永久限购 | 配置表 |
| 刷新规则 | 不刷新/每日刷新/每周刷新 | 配置表 |
推荐存放方式:配置表(静态数据)
这样设计的好处:
- 商品信息集中管理,方便批量修改
- 活动商品、限时折扣可以新建配置表而不影响原数据
- 商店UI只需要读取配置表,不需要硬编码商品信息
📚 相关阅读:创游世界数据类型速查卡 - 数据类型详解
2.2 玩家状态层
负责记录玩家与商店相关的个人状态。
| 字段 | 说明 | 存放位置 |
|---|---|---|
| 当前货币 | 金币、钻石、券、材料数量 | 玩家变量 |
| 已购买次数 | 每个商品的限购计数 | 玩家变量 |
| 刷新时间 | 上次刷新的时间戳 | 玩家变量 |
| 折扣状态 | 是否有折扣、折扣比例 | 玩家变量 |
推荐存放方式:玩家变量(持久化数据)
📚 相关阅读:创游世界变量与作用域完全指南 - 变量详解
2.3 交易处理层
负责处理购买的核心逻辑,这是商店系统的「大脑」。
购买流程:
1. 检查货币是否足够
2. 检查是否在限购范围内
3. 扣减货币
4. 发放物品到背包
5. 记录购买次数
6. 发送购买成功广播交易处理层的脚本应该放在地图脚本或系统管理对象上,而不是放在UI脚本里。
📚 相关阅读:广播机制深度解析 - 广播详解
2.4 UI展示层
负责显示商品列表、价格、购买按钮状态,以及接收玩家的购买请求。
UI展示层的职责:
- 显示商品列表(从商品定义层读取)
- 显示价格(考虑折扣后)
- 显示是否可购买(从玩家状态层读取)
- 触发购买请求(发送到交易处理层)
- 接收购买结果并刷新显示
📚 相关阅读:UI系统与切换机制解析 - UI系统详解
3. 数据结构设计示例
3.1 商品配置表结构
配置表:商店_商品表
行1:商品ID=1001, 名称="血瓶", 价格类型=金币, 价格=100, 产出=血瓶×1, 限购=每日3次
行2:商品ID=1002, 名称="蓝瓶", 价格类型=金币, 价格=80, 产出=蓝瓶×1, 限购=每日3次
行3:商品ID=2001, 名称="稀有武器", 价格类型=钻石, 价格=500, 产出=武器×1, 限购=永久1次📚 相关阅读:创游世界变量与作用域完全指南 - 配置表详解
3.2 玩家购买记录结构
玩家变量:商店_购买记录
格式:数组,每个元素是一个结构体
元素1:{商品ID: 1001, 已购买次数: 2, 最后购买时间: 时间戳}
元素2:{商品ID: 1002, 已购买次数: 1, 最后购买时间: 时间戳}3.3 货币状态结构
玩家变量:金币 = 5000
玩家变量:钻石 = 200
玩家变量:兑换券 = 10📚 相关阅读:创游世界背包与货币系统设计入门 - 背包货币系统
4. 购买流程详细实现
4.1 校验阶段
# UI脚本:当购买按钮被点击
发送广播 "商店_请求购买" 带参数 商品ID
# 地图/系统脚本:当收到 "商店_请求购买"
获取参数 商品ID
# 检查货币是否足够
获取玩家变量 金币
如果 金币 >= 价格 则 继续,否则 发广播 "商店_货币不足"
# 检查限购
获取玩家变量 商店_购买记录
查找 商品ID 的已购买次数
如果 已购买次数 < 限购次数 则 继续,否则 发广播 "商店_已达购买上限"📚 相关阅读:创游世界UI数据同步架构 - UI同步架构
4.2 交易阶段
# 扣减货币
设置玩家变量 金币 = 金币 - 价格
# 发放物品
获取配置表 商品ID 的产出信息
调用 "背包_添加物品" 指令(需要自己写或用官方能力)
# 记录购买
设置玩家变量 商店_购买记录 中 商品ID 的已购买次数 + 1
# 发送成功广播
发送广播 "商店_购买成功" 带参数 商品ID4.3 UI刷新阶段
# UI脚本:当收到 "商店_购买成功"
重新读取当前货币
重新读取已购买次数
刷新商品列表显示
显示购买成功提示
# UI脚本:当收到 "商店_货币不足"
显示 "货币不足" 提示
# UI脚本:当收到 "商店_已达购买上限"
显示 "已达购买上限" 提示5. 限购与刷新机制
5.1 限购类型
| 类型 | 说明 | 实现方式 |
|---|---|---|
| 无限购 | 可以无限购买 | 不记录购买次数 |
| 每日限购 | 每天限制购买次数 | 记录"最后购买日期",每天重置 |
| 每周限购 | 每周限制购买次数 | 记录"本周开始日期",每周重置 |
| 永久限购 | 只能购买固定次数 | 永久记录,不重置 |
5.2 每日限购实现思路
# 在购买时检查
获取当前日期
获取玩家变量 商店_上次重置日期
如果 上次重置日期 < 当前日期:
→ 重置所有商品的已购买次数
→ 更新 上次重置日期 = 当前日期
继续购买流程...5.3 刷新机制实现思路
# 在打开商店时检查
获取当前时间
获取玩家变量 商店_上次刷新时间
如果 (当前时间 - 上次刷新时间) > 刷新间隔:
→ 重置商品库存(某些商品)
→ 更新 上次刷新时间 = 当前时间
加载商品列表...6. 折扣与活动商店
6.1 折扣实现
玩家变量:商店_折扣状态 = {
是否有折扣: 真,
折扣比例: 0.8, # 8折
结束时间: 时间戳
}
# 在显示价格时应用折扣
如果 商店_折扣状态.是否有折扣 == 真:
显示价格 = 原价 × 折扣比例
否则:
显示价格 = 原价6.2 活动商品思路
配置表:商店_活动商品
行1:商品ID=活动001, 名称="限时礼包", 原价=1000, 活动价=500, 活动时间=范围
# 在加载商品时检查活动
获取当前时间
获取配置表 所有活动商品
筛选活动时间包含当前时间的商品
添加到商品列表7. 商店与背包的共用方案
7.1 共用数据结构
建议商品产出定义与背包物品定义共用同一套ID体系:
物品ID规则:
1000-1999 = 消耗品(血瓶、蓝瓶等)
2000-2999 = 装备(武器、防具等)
3000-3999 = 材料(强化石、宝石等)
5000-5999 = 礼包/宝箱📚 相关阅读:创游世界数据类型完全指南 - 数据类型详解
7.2 背包物品结构
玩家变量:背包_物品列表
格式:数组
元素1:{物品ID: 1001, 数量: 5, 品质: 普通}
元素2:{物品ID: 2001, 数量: 1, 品质: 稀有}7.3 商店购买产出到背包的流程
# 购买成功后
获取配置表 商品ID 的产出信息
获取产出物品ID 和 数量
调用 背包_添加物品(物品ID, 数量)
# 背包脚本负责
检查背包是否有空位
如果有空位:添加物品到列表
如果没有空位:返回"背包已满"
发送广播 "背包_刷新"8. 抽奖系统设计
8.1 抽奖与普通商店的区别
| 维度 | 普通商店 | 抽奖系统 |
|---|---|---|
| 产出 | 确定 | 概率性 |
| 价格 | 固定 | 固定或消耗抽奖券 |
| 库存 | 有 | 通常无 |
| 限购 | 通常有 | 可能无 |
8.2 抽奖奖池配置
配置表:抽奖_奖池
行1:物品ID=3001, 名称="强化石", 概率=0.5, 数量=1, 品质=普通
行2:物品ID=3002, 名称="宝石", 概率=0.3, 数量=1, 品质=稀有
行3:物品ID=2001, 名称="稀有武器", 概率=0.1, 数量=1, 品质=稀有
行4:物品ID=5001, 名称="传说装备", 概率=0.05, 数量=1, 品质=传说
行5:物品ID=空, 名称="谢谢参与", 概率=0.05, 数量=0, 品质=无📚 相关阅读:创游世界数据类型速查卡 - 数组与概率
8.3 抽奖实现
# UI脚本:点击抽奖按钮
发送广播 "抽奖_请求抽奖" 带参数 抽奖ID
# 地图/系统脚本:计算抽奖结果
获取配置表 抽奖_奖池
根据概率随机抽取
扣除抽奖券或金币
发放物品到背包
记录抽奖记录
发送广播 "抽奖_结果" 带参数 物品ID、品质9. 兑换系统设计
9.1 兑换与商店的区别
| 维度 | 普通商店 | 兑换系统 |
|---|---|---|
| 货币类型 | 金币/钻石 | 活动材料/声望 |
| 刷新 | 通常有 | 通常无 |
| 限购 | 通常有 | 可能有 |
9.2 兑换配置
配置表:兑换_商品表
行1:商品ID=兑换001, 名称="限定皮肤", 需要材料=材料A×10 + 材料B×5, 库存=1
行2:商品ID=兑换002, 名称="称号", 需要声望×1000, 库存=无限10. 常见问题
Q:为什么购买后UI没更新?
A: 检查是否发送了刷新广播,UI是否正确监听刷新广播。
Q:为什么金币扣了但背包没进货?
A: 检查购买流程中是否正确调用了背包添加逻辑。
Q:限购计数为什么会重置?
A: 检查限购计数是否放在玩家变量里持久化保存。
📚 相关阅读:常见问题与避坑指南 - 商店问题解决
11. 常见错误与避坑
错误1:把商品列表直接写死在UI脚本里
问题:后面有刷新规则、活动商品、折扣逻辑时很难维护。
正确做法:商品信息放在配置表,UI脚本只负责读取和显示。
错误2:先更新UI,再做购买校验
问题:容易出现显示成功、实际失败的假同步。
正确做法:先在后台完成校验和扣费,成功后再通知UI刷新。
错误3:货币扣减和物品发放没有原子性
问题:如果扣了货币但发放失败,会导致玩家损失。
正确做法:在同一个脚本里完成扣费和发放,或者用事务性设计确保一致性。
错误4:金币、钻石、券、兑换材料各自独立乱写
问题:资源扣减规则分散,后期非常难统一。
正确做法:统一设计货币管理模块,所有购买都通过同一套接口。
错误5:限购计数没有持久化
问题:玩家重进游戏后限购次数重置。
正确做法:限购计数放在玩家变量里持久化保存。
📚 相关阅读:创游世界新手避坑完全指南 - 避坑指南
相关页面
项目设计
- 创游世界多地图与场景切换设计指南 - 场景设计
- 创游世界地图设计基础指南 - 地图设计
- 创游世界项目维护与代码组织规范 - 项目维护
脚本系统
- 创游世界背包与货币系统设计入门 - 背包货币系统
- 创游世界UI数据同步架构 - UI同步架构
- 脚本作用域与数据流深度研究 - 数据分层
- 创游世界项目结构模板 - 项目模板
核心研究
- 创游世界变量与作用域完全指南 - 变量详解
- 创游世界数据类型完全指南 - 数据类型详解
教程资料
- 创游世界商店系统速查卡 - 商店速查
- 广播机制深度解析 - 广播详解
- UI系统与切换机制解析 - UI系统详解
问题解决
- 常见问题与避坑指南 - 商店问题解决
- 创游世界新手常见问题汇总 - 常见问题
- 创游世界新手问题快速索引 - 问题索引
导航入口
- 项目设计导航 - 项目设计总入口
- 教程资料导航 - 教程资料总入口
- 创游世界知识库总导航 - 知识库总导航
关联阅读
核心研究
- 核心研究导航 - 核心研究总入口
- 核心概念速查手册 - 核心概念速查
- 创游世界核心概念速查 - 核心概念快速索引
- 广播与事件机制导航 - 广播与事件导航
- 数据、变量与作用域导航 - 数据系统入口
- UI与交互研究导航 - UI系统入口
- 版本与能力边界导航 - 版本演进入口
- 组件与对象系统导航 - 组件体系入口
- 脚本系统研究导航 - 脚本系统专题入口
脚本系统
- 脚本系统导航 - 脚本系统总入口
- 脚本界面与积木知识索引 - 积木块总览
- 创游世界触发时机速查卡 - 触发时机速查
- 创游世界广播使用速查卡 - 广播速查
- 创游世界变量作用域速查卡 - 变量速查
教程资料
- 教程资料导航 - 教程资料总入口
- 常见问题与避坑指南 - 常见问题解决
- 创游世界新手常见问题汇总 - 常见问题
- 创游世界新手问题快速索引 - 问题索引
导航入口
- 项目设计导航 - 项目设计总入口
- 新手阅读路线 - 学习路线导航
- 创游世界知识库总导航 - 知识库总导航
最后更新:2026-06-10维护者:Azek431
