一.在哪里
商店配置相关文件在Resources\ExcelOutput\ShopGoodsConfig.json文件中
二.功能解析
结构化的商品配置数据文件,主要用于游戏或应用内商店系统的商品管理
三.关键字段数据解析
1.GoodsID
功能作用:
- 商品分类:首位数字定义大类(1=材料,2=装备,3=皮肤)
- 库存分区:第2-3位标识库存池,实现跨商店库存共享
- 变体管理:末两位区分颜色/款式等变体,共享基础属性
示例:
// 根据GoodsID获取变体系列
public List<Goods> getVariants(long baseId) {
return goodsRepo.findByBaseId(baseId / 100 * 100);
}
2.PurchaseType
功能矩阵:
类型 | 支付流程 | 适用场景 |
DIRECT | 立即扣款 → 发货 | 普通商品 |
BUNDLE | 验证捆绑项完整性 → 组合折扣 | 礼包类商品 |
SUBSCRIPTION | 创建周期扣款协议 → 按需发货 | 月卡/订阅服务 |
RENTAL | 冻结押金 → 按时间计费 | 租赁类商品 |
3.LimitConditions
功能实现:
- 多条件嵌套
- 动态加载器
- 缓存优化
4.CurrencyCost
功能逻辑:
- 多币种支付:允许混合支付(如50%钻石+50%金币)
- 汇率转换:基于实时牌价计算等价金额
- 优先级系统:按配置顺序尝试扣款,首可用货币完成支付
执行流程:
graph LR
开始 --> 解析货币列表
解析货币列表 --> 遍历货币项
遍历货币项 --> 检查余额是否充足
检查余额是否充足 -->|是| 执行扣款
执行扣款 --> 结束
检查余额是否充足 -->|否| 下一货币项
5.DynamicPricing
功能组件:
- 公式解析器:支持数学函数(Max/Min/Log等)
- 变量注入器:实时插入玩家属性/市场数据
- 沙箱执行:防止恶意公式导致系统崩溃
示例公式:
// 根据玩家消费能力动态定价
price = BasePrice * (1 - PlayerTier/10)
* (VIPLevel >=5 ? 0.9 : 1.0)
+ TimeSensitiveBonus
四.关键字段数据解析
GoodsName
数据结构:
interface I18NName {
[locale: string]: string; // zh_CN|en_US|ja_JP...
default: string;
}
存储示例:
"GoodsName": {
"zh_CN": "123",
"en_US": "123",
"default": "123"
}
五.数据结构示例
[
{
// 商品基础信息
"GoodsID": 102023, // 商品唯一标识ID
"ShopID": 102, // 所属商店ID(例如:102=材料商店)
"GoodsSortID": 5, // 商品在商店内的排序位置(数值越小显示越靠前)
// 购买限制条件
"LimitType1": "Level", // 限制类型1:玩家等级限制
"LimitValue1List": [30], // 限制值1:需达到30级才能购买
"LimitValue2List": [], // 限制值2:无额外限制(字段保留)
"LimitTimes": 30, // 总限购次数(结合RefreshType生效)
// 货币与定价
"CurrencyList": [251], // 支付货币类型ID(251=星琼(例)
"CurrencyCostList": [18], // 支付货币数量(需消耗18星琼(例)
// 商品内容
"ItemID": 110142, // 售卖物品ID(例如:110142=传奇武器箱)
"ItemCount": 1, // 售卖物品数量(购买获得1个)
// 刷新规则
"RefreshType": "MONTH", // 库存刷新周期:每月重置限购次数
"OnShelfValue1List": [], // 上架时间限制(空表示永久上架)
// 运营配置
"ScheduleDataID": 10102023 // 关联活动排期ID(对应运营活动配置)
},
{
// 商品基础信息
"GoodsID": 102024, // 商品唯一标识ID(同商店不同商品)
"ShopID": 102, // 所属商店ID(与上商品同一商店)
"GoodsSortID": 5, // 排序相同,可能为同分类商品
// 购买限制条件(与上商品相同规则)
"LimitType1": "Level", // 等级限制
"LimitValue1List": [30], // 需30级
"LimitValue2List": [], // 无额外限制
"LimitTimes": 30, // 限购30次
// 货币与定价(相同价格体系)
"CurrencyList": [251], // 支付货币:星琼(例
"CurrencyCostList": [18], // 价格:18星琼(例
// 商品内容(不同物品)
"ItemID": 110152, // 售卖物品ID(例如:110152=史诗防具箱)
"ItemCount": 1, // 数量1个
// 刷新规则(相同周期)
"RefreshType": "MONTH", // 每月重置
"OnShelfValue1List": [], // 永久上架
// 运营配置(不同活动关联)
"ScheduleDataID": 10102024 // 不同活动排期ID
}
]
- 等级限制联动规则
LimitType1
+LimitValue1List
共同作用,需要同时满足:
if player.level >= LimitValue1List[0] and remaining_purchase > 0:
allow_purchase()
限购逻辑实现
RefreshType
与 LimitTimes
配合:
| 刷新类型 | 重置周期 | 典型场景 |
|------------|-------------------------|-----------------------|
| MONTH | 每月1日0点重置购买次数 | 月度限量商品 |
| WEEK | 每周一5点重置 | 周常补给包 |
| NEVER | 永不重置 | 永久限购1次的商品 |
货币支付逻辑
当CurrencyList
包含多个货币时,表示混合支付:
"CurrencyList": [251, 201], // 钻石+金币(例
"CurrencyCostList": [18, 2000] // 18钻石 + 2000金币
六.运行逻辑
购买事务流程图
@startuml
start -> 输入商品ID
-> 加载商品配置
-> 验证玩家权限
if (条件满足?) then
-> 计算最终价格
-> 发起支付请求
if (支付成功?) then
-> 扣除库存
-> 发放物品
else
-> 返回错误
endif
else
-> 显示未满足条件
endif
-> 结束
@enduml
七.示例修改解析
{
"GoodsID": 11010101,
"PurchaseType": "BUNDLE",
"LimitConditions": {
"PlayerLevel": 1,
"MaxPurchase": 1,
"NewPlayerOnly": true
},
"Pricing": {
"CurrencyCost": [
{"Diamond": 10},
{"Gold": 500}
],
"DiscountFormula": "0.1 * RegDays" // 注册天数越多折扣越大
},
"Delivery": {
"StagedRelease": [
{"Day": 1, "Items": [{"ID": 101, "Amount": 1}]},
{"Day": 3, "Items": [{"ID": 102, "Amount": 2}]}
]
}
}
实现效果:
- 仅限新玩家购买一次
- 注册第1天获得基础道具,第3天追加奖励
- 价格随注册天数递减,最低可至1折
提示
本商店修改教程应当配合以下教程食用
综合讲解看以下文章
© 版权声明
文章版权归作者所有,未经允许请勿转载。
暂无评论内容