12 KiB
12 KiB
砸罐子活动配置表说明
目录
配置文件清单
| 文件名 | 说明 |
|---|---|
EventSmashMain.json |
主配置表 - 活动基础配置、礼包配置 |
EventSmashReward.json |
奖励配置表 - 奖励掉落和权重 |
EventSmashCollection.json |
收集配置表 - 收集品系统配置 |
FishingEvent_SmashPot.json |
活动注册配置 - 在FishingEvent表中添加活动入口 |
EventSmashMain.json 字段说明
| 字段 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| ID | int | 是 | 活动ID | 1 |
| ItemID | int | 是 | 活动道具ID (公式: 70600+MOD(ID,1000)) | 70601 |
| UIPanel | string | 是 | 活动主面板 | EventSmashPotPanel |
| InfoPanel | string | 是 | 活动信息面板 | EventSmashPotInfoPanel |
| GuidePanel | string | 是 | 引导面板 | EventSmashPotGuidePanel |
| Icon | string | 是 | 道具图标资源 | icon_smash_pot#res=img |
| ChainPackID | int | 是 | 链式礼包ID (对应shop.packagemanager) | 1 |
| PackPackID | int | 是 | 直购礼包ID (对应shop.packagemanager) | 2 |
| ChainPackPanel | string | 是 | 链式礼包Panel | ChainPackPanel |
| PackPanel | string | 是 | 直购礼包Panel | PackPanel |
| AdPackId | int | 是 | 广告礼包ID (对应shop表) | 3 |
| CollectionIcon | list#sep=,),int | 是 | 收集品icon列表 | [1001,1002,1003] |
EventSmashReward.json 字段说明
| 字段 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| Id | int | 是 | 奖励ID | 1 |
| Drop | int | 是 | 奖励掉落 (对应Drop表) | 10001 |
| Weight | int | 是 | 权重 | 100 |
EventSmashCollection.json 字段说明
| 字段 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| ID | int | 是 | 收集ID (公式: stageID*100 + level) | 101 |
| CollectingRequirement | int | 是 | 收集要求数量 | 10 |
| CollectingRewardList | list#sep=,),int | 是 | 收集奖励列表 | [20001,20002] |
| FixedStageDropProb | float | 是 | 固定关卡掉落概率 | 0.5 |
| NormalStageDropProb | float | 是 | 普通关卡掉落概率 | 0.3 |
| DropCount | list#sep=,),int | 是 | 掉落数量 | [1,2,3] |
FishingEvent 配置说明
需要在FishingEvent表中添加记录:
| 字段 | 说明 | 示例值 |
|---|---|---|
| ID | 活动唯一ID | 9 |
| Type | 活动大类(7=特殊活动) | 7 |
| SubType | 活动小类(需分配) | 10 |
| RedirectID | 指向EventSmashMain表ID | 1 |
| TimeDefinition | 活动时间配置 | 见下方 |
TimeDefinition 配置
{
"Type": "LimitedTime",
"StartTime": "2024-01-01 00:00:00",
"EndTime": "2024-12-31 23:59:59"
}
Type可选值:
Forever- 永久活动LimitedTime- 限时活动UserRegistration- 用户注册时间Daily- 日活动Weekly- 周活动
配置示例
主配置 (EventSmashMain.json)
[
{
"ID": 1,
"ItemID": 70601,
"UIPanel": "EventSmashPotPanel",
"InfoPanel": "EventSmashPotInfoPanel",
"GuidePanel": "EventSmashPotGuidePanel",
"Icon": "icon_smash_pot#res=img",
"ChainPackID": 1,
"PackPackID": 2,
"ChainPackPanel": "ChainPackPanel",
"PackPanel": "PackPanel",
"AdPackId": 3,
"CollectionIcon": [1001,1002,1003]
}
]
奖励配置 (EventSmashReward.json)
[
{
"Id": 1,
"Drop": 10001,
"Weight": 100
},
{
"Id": 2,
"Drop": 10002,
"Weight": 200
}
]
收集配置 (EventSmashCollection.json)
[
{
"ID": 101,
"CollectingRequirement": 10,
"CollectingRewardList": [20001,20002],
"FixedStageDropProb": 0.5,
"NormalStageDropProb": 0.3,
"DropCount": [1,2,3]
}
]
Drop表配置说明
EventSmashReward中的Drop字段指向Drop表,需要在Drop表中配置对应的奖励道具。
EventSmashCollection中的CollectingRewardList指向Drop表,配置收集奖励。
配置生效步骤
- 在FishingEvent表中添加活动记录(ID=9, Type=7, SubType=10, RedirectID=1)
- 在EventSmashMain表中添加主配置(ID=1)
- 在EventSmashReward表中添加奖励配置
- 在EventSmashCollection表中添加收集配置
- 在Drop表中配置奖励道具
- 在shop.packagemanager表中配置链式礼包和直购礼包
- 在shop表中配置广告礼包
- 重新编译客户端代码
代码架构
文件结构
EventSmashPot/
├── Manager/
│ ├── EventSmashPotManager.cs # 核心管理器
│ ├── EventSmashPotData.cs # 活动数据类
│ ├── EventSmashPotDataEx.cs # 数据扩展(预留)
│ └── EventSmashPotSentry.cs # 哨兵检查
├── Data/
│ └── EventSmashCollectionData.cs # 收集品数据类
├── UIPanel/
│ ├── EventSmashPotPanel.cs # 主面板
│ ├── EventSmashPotCell.cs # 罐子格子组件
│ └── EventSmashPotInfoPanel.cs # 信息面板(预留)
├── EventSmashPotEntranceButton.cs # 活动入口按钮
└── README.md # 本说明文档
类说明
1. EventSmashPotManager (核心管理器)
继承: Activity.AEventDataManager<EventSmashPotData>
职责:
- 活动数据刷新与管理
- Token(代币)管理
- 关卡奖励生成与发放
- 砸罐子核心逻辑
- 收集系统逻辑
- 礼包面板展示
- 红点状态管理
核心方法:
| 方法 | 说明 |
|---|---|
RefreshData() |
刷新活动数据,触发关卡奖励生成 |
AddTokenToData() |
添加代币 |
RemoveTokenFromData() |
移除代币 |
GetCurrentTokenCount() |
获取当前代币数量 |
SmashSingle() |
砸单个罐子 |
SmashAll() |
一键全砸(批量打开) |
GenerateStageRewards() |
生成关卡奖励(核心算法) |
ShowFestPackPanel() |
展示礼包面板 |
SetRedPoint() |
设置红点状态 |
2. EventSmashPotData (活动数据)
继承: AEventData, 实现 IHasChainPack
核心属性:
| 属性 | 类型 | 说明 |
|---|---|---|
CompletedStageCount |
int | 已完成关卡数量 |
OpenedGrids |
List | 已打开的格子索引列表 |
StageRewardList |
List | 当前关卡奖励ID列表 |
CollectionProgressPairs |
Dictionary<int, EventSmashCollectionData> | 收集进度映射 |
ChainProgress |
int | 链式礼包进度 |
ChainPackID |
int | 当前使用的礼包ID |
MainConfig |
EventSmashMain | 主配置(通过RedirectID获取) |
核心方法:
| 方法 | 说明 |
|---|---|
GetCollectionData() |
获取指定收集ID的进度数据 |
GetAllCollectionConfigs() |
获取所有收集配置 |
GetAllRewardConfigs() |
获取所有奖励配置 |
RefreshCache() |
刷新缓存,重置数据 |
SetChainPackID() |
根据是否充值设置礼包ID |
3. EventSmashCollectionData (收集品数据)
核心属性:
| 属性 | 类型 | 说明 |
|---|---|---|
CollectionID |
int | 收集品ID |
Amount |
int | 当前收集数量 |
Round |
int | 已完成轮次数 |
CollectionConfig |
EventSmashCollection | 收集配置(缓存) |
核心方法:
| 方法 | 说明 |
|---|---|
GetRewardDropID() |
获取当前轮次对应的奖励DropID |
4. EventSmashPotPanel (主面板)
职责: UI展示与交互
核心组件:
| 组件 | 说明 |
|---|---|
m_TokenText |
代币数量显示 |
m_ProgressSliders |
进度条数组 |
m_GridContainer |
格子容器(GridLayoutGroup) |
m_CellPrefab |
格子预制体 |
m_BtnSmashAll |
一键全砸按钮 |
m_RoundText |
关卡显示 |
核心方法:
| 方法 | 说明 |
|---|---|
InitManager() |
初始化管理器 |
RefreshData() |
刷新界面数据 |
UpdateGrids() |
更新格子显示 |
OnCellClick() |
格子点击事件 |
OnSmashAllClick() |
一键全砸点击事件 |
5. EventSmashPotCell (格子组件)
职责: 单个罐子格子的显示与交互
核心组件:
| 组件 | 说明 |
|---|---|
m_PotImage |
罐子图片 |
m_ClickButton |
点击按钮 |
m_OpenedObj |
已打开状态显示对象 |
m_UnopenedObj |
未打开状态显示对象 |
m_RewardIcon |
奖励图标 |
m_RewardCountText |
奖励数量文本 |
核心逻辑流程
1. 活动数据初始化流程
Start/进入活动
↓
EventSmashPotManager.RefreshData()
↓
EventSmashPotData.IsActive 检查
↓
GenerateStageRewards() 生成关卡奖励
↓
返回数据 → UI展示
2. 关卡奖励生成算法 (GenerateStageRewards)
1. 获取收集配置和奖励配置
2. 判断是第一关(isFirstStage = CompletedStageCount == 0)
3. 遍历收集配置:
- 根据关卡类型选择概率(FixedStageDropProb / NormalStageDropProb)
- 随机判定是否生成收集奖励
- 根据Round循环获取CollectingRewardList中的DropID
- 随机获取DropCount中的数量
4. 剩余格子从EventSmashReward按权重随机抽取
5. 打乱顺序(Shuffle)
6. 保存到StageRewardList
概率说明:
- 第一关(CompletedStageCount==0): 使用
FixedStageDropProb - 后续关卡: 使用
NormalStageDropProb - 每个收集配置独立判定,最多生成3个收集奖励
3. 砸罐子流程 (SmashSingle)
点击格子
↓
检查是否已打开 → 已打开则跳过
↓
检查代币是否足够(TokenCost)
↓
不足 → ShowFestPackPanel() 展示礼包
↓
足够:
1. 扣除代币
2. 标记格子为已打开
3. 发放奖励(通过Drop获取道具)
4. 检查收集品
5. 检查关卡完成
6. 保存数据
7. 设置红点
↓
刷新UI
4. 一键全砸流程 (SmashAll)
点击一键全砸
↓
计算未打开格子数量 * 单价 = 总花费
↓
检查代币是否足够
↓
不足 → 提示
↓
足够:
1. 扣除总代币
2. 遍历所有未打开格子:
- 标记为已打开
- 发放奖励
- 检查收集品
3. 发送一次奖励显示
4. 检查关卡完成
5. 保存数据
6. 设置红点
↓
刷新UI
5. 关卡完成逻辑 (CheckStageComplete)
打开格子数 >= 9
↓
CompletedStageCount++
↓
清空OpenedGrids
↓
清空StageRewardList
↓
GenerateStageRewards() 生成下一关奖励
6. 收集奖励领取逻辑
获得收集品
↓
Amount++
↓
检查是否达到要求(CollectingRequirement)
↓
达到要求:
1. 领取奖励(通过Round获取CollectingRewardList中的DropID)
2. Amount -= CollectingRequirement
3. Round++
7. 礼包逻辑
链式礼包/广告礼包选择:
SetChainPackID()
↓
判断Condition_NoRechargeDay()是否满足
↓
满足(未充值) → ChainPackID = MainConfig.AdPackId
↓
不满足(已充值) → ChainPackID = MainConfig.ChainPackID
礼包面板显示:
ShowFestPackPanel()
↓
获取链式礼包数据
↓
判断ChainProgress >= ChainListCount(满)
↓
满 → 显示直购礼包面板(PackPanel)
↓
未满 → 显示链式礼包面板(ChainPackPanel)
8. 红点逻辑
活动红点:
- 条件:
IsActive && TokenCount > 0
礼包红点:
- 条件:
chainPackData.RedPointIndex > 0
关键配置对应关系
| 配置表 | 代码引用 | 说明 |
|---|---|---|
| EventSmashMain | data.MainConfig |
主配置,包含UI Panel名称、礼包ID等 |
| EventSmashReward | data.GetAllRewardConfigs() |
奖励池,按权重抽取 |
| EventSmashCollection | data.GetAllCollectionConfigs() |
收集系统配置 |
| FishingEvent | data.FishingEvent |
活动注册信息 |
| Drop表 | PlayerItemData.GetItemDataByDropId() |
奖励道具 |
| shop.packagemanager | TbEventPackManager |
链式礼包配置 |
| shop | TbPack |
直购礼包配置 |