Skip to content
写作:待补充更新:2026-05-16字数:—阅读:—维护:Azek431

创游世界商店系统实战设计指南

一句话摘要

本文讲解创游世界中商店系统的完整设计思路,涵盖商品数据结构、货币扣减、购买校验、库存刷新与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

# 发送成功广播
发送广播 "商店_购买成功" 带参数 商品ID

4.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:限购计数没有持久化

问题:玩家重进游戏后限购次数重置。

正确做法:限购计数放在玩家变量里持久化保存。

📚 相关阅读:创游世界新手避坑完全指南 - 避坑指南


相关页面

项目设计

脚本系统

核心研究

教程资料

问题解决

导航入口

关联阅读

核心研究

脚本系统

教程资料


导航入口


最后更新:2026-06-10维护者:Azek431

参与维护

发现文档问题?

你可以编辑页面、提交反馈,或复制链接给维护者,帮助这个资料库继续变好。

由 Azek431 整理与维护 | 基于 MIT 许可证开源