Files
dc-docs/output/feishu-docs/IcdpwGeP2ixZqSkNpmOcy8hInXc.md
T
2026-06-23 14:43:31 +08:00

52 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# IcdpwGeP2ixZqSkNpmOcy8hInXc
Source: https://dianchukeji.feishu.cn/wiki/IcdpwGeP2ixZqSkNpmOcy8hInXc
# 一.工作内容概述
- 分析《佛系消消消》的关卡系统逻辑,并以此作为参考,对项目现有关卡系统进行重构;
- 将解包提取出的关卡数据完整迁移至重构后的关卡库中,作为项目关卡内容填充;
- 制作并接入加载场景界面,完善场景切换过程中的过渡体验。
# 二.《佛系消消消》关卡系统逻辑
在完成《佛系消消消》关卡数据提取后,今日进一步梳理了其关卡系统的组织方式和运行逻辑。整体来看,它并不是简单采用“第几关对应一个关卡文件”的存储方式,而是通过分层结构来管理不同模式下的关卡选择、索引映射和资源加载。
从逻辑上看,《佛系消消消》的关卡系统大致可以拆成三层:玩法编排层、模式索引层、资源定位与数据存储层。
## 玩法编排层
主要负责决定当前要进入哪一类关卡。不同模式不会直接读取具体关卡文件,而是先根据当前游戏状态选择关卡。例如,普通模式根据主线进度选择关卡;每日挑战根据日期索引选择关卡;生存模式则根据当前波次、难度组或关卡池规则选择关卡。这一层更关注玩法规则和关卡投放逻辑,而不是具体资源路径。
## 模式索引层
主要负责把“玩法层选中的关卡”转换成稳定的 resourceId。这里会用到 LevelId、LevelPoolGroups、DailyLevel、DoubleBullLevel、SurvivalLevel 等索引表。resourceId 可以理解为关卡资源的稳定编号,它和玩家看到的显示关卡号是解耦的。例如玩家看到的是第 100 关,但底层真正加载的是某个 resourceId 对应的资源。这样后续即使要插入关卡、调整顺序、复用关卡或做关卡池循环,也不容易影响已有进度。
从实际提取的数据看,各索引表的分工比较清晰:LevelId 负责前 200 个主线关卡映射;LevelPoolGroups 负责 201 关之后的主线关卡池化;DailyLevel 负责每日挑战关卡循环;DoubleBullLevel 负责双牛模式;SurvivalLevel 则按波次和难度组维护关卡池。也就是说,不同玩法虽然有不同的选关规则,但最终都会统一落到 resourceId 上。
## 资源定位与数据存储层
resourceId 会继续通过 LevelJsonBatchMap 查询到具体资源位置,包括 bundle 名称、chunk 文件名和棋盘尺寸等信息。BatchMap 相当于一张总资源定位表,覆盖 Normal 和 DoubleBull 两种模式的全部关卡。真正的关卡数据则存放在 LevelPartXX.json、DoubleBullXX.json 这类分包文件中。
具体数据上,Normal 模式共提取到 3296 关,按 LevelPart01–33 拆分;DoubleBull 模式共 856 关,按 DoubleBull01–09 拆分。每个 chunk 通常存放约 100 关,内部再通过 levels 数组保存具体 LevelData。每条 LevelData 中包含 resourceId、棋盘大小、区域划分、种子坐标等运行时需要的数据。
这种结构的核心特点是:玩法选择、关卡索引和资源存储三者分离。玩法层只关心当前要玩什么,索引层负责把玩法需求转换成稳定资源编号,资源层再根据编号定位并加载具体数据。这种设计带来的好处也比较明显:
- 显示关卡号和真实资源编号分离,方便后续插入、重排和复用关卡;
- 多个关卡合并成 chunk 存储,减少大量单关文件带来的管理成本;
- 通过 BatchMap 统一定位资源,不同玩法可以复用同一套底层关卡数据;
- 每日挑战、生存模式等玩法可以引用已有主线关卡,减少重复数据;
- 生存模式可以通过关卡池和难度组进行抽取,便于控制渐进难度;
- 配合 Addressables 或远程资源加载,可以减少首包体积,后续按需下载。
这次分析的价值不只是拿到了关卡数据,更重要的是学习了上线项目在关卡数量增长、多模式复用、包体控制和后续扩展方面的组织方式。相比把所有关卡直接堆在 resources 目录中,这种“模式索引 + 稳定 resourceId + BatchMap 定位 + 分包 chunk 存储”的结构,更适合长期维护和持续扩展。
# 三.项目关卡系统逻辑重构
在分析完《佛系消消消》的关卡系统后,今日也同步对当前项目的关卡存储和加载逻辑进行了重构。本次重构的目标不是单纯替换一批关卡数据,而是将项目原本较直接的资源读取方式,调整为更适合长期维护的分层式关卡管理结构。
原先项目中的关卡资源更偏向按玩法目录分别存放,例如普通关卡、每日关卡、双牛模式、生存模式各自维护一套资源目录。这种方式在关卡数量较少时比较直观,但随着关卡数量增加、玩法模式变多,会逐渐出现几个问题:
- 不同模式之间难以复用关卡数据,容易产生重复资源;
- 显示关卡号和真实关卡文件绑定过紧,后续插入或重排关卡容易影响已有进度;
- 所有关卡都放在 resources 下,不利于后续做小游戏分包、远程加载或按需加载;加载逻辑也分散在不同调用方中,维护成本会变高。
因此,本次重构参考《佛系消消消》的组织方式,将项目关卡系统调整为“玩法索引 + resourceId + BatchMap + bundle chunk”的结构。
## 新增统一索引表
项目中加入了 LevelId、LevelPoolGroups、DailyLevel、DoubleBullLevel、SurvivalLevel、LevelJsonBatchMap 六张 JSON 表。其中,前几张表负责不同玩法模式下的关卡选择和 resourceId 映射,LevelJsonBatchMap 则负责根据 resourceId 统一定位资源所在的 bundle、chunk 和棋盘尺寸。这样以后无论是普通模式、每日挑战、双牛模式,还是生存模式,都可以走同一套底层资源定位逻辑。
## 新增 bundle 数据目录
关卡数据不再按照旧的 resources 目录零散存放,而是迁移 leveldata_normal、leveldata_doublebull 等 bundle 目录中,并按照 LevelPartXX、DoubleBullXX 这种 chunk 方式组织。当前 Normal 模式共 3296 关,DoubleBull 模式共 856 关,合计 4152 条关卡资源定位记录。这样的结构天然适合后续做小游戏分包,也为远程加载、云端关卡更新和资源热更新预留了空间。
## 重构 LevelRepository
它现在作为关卡系统的统一入口,负责把上层玩法需求转换成具体关卡数据。整体流程可以概括为:先加载索引表,再根据玩法类型解析 resourceId,接着通过 BatchMap 定位关卡所在的 bundle 和 chunk,最后加载 JSON 数据并取出对应的 LevelData。
为了减少重复加载,LevelRepository 内部还加入了多级缓存机制,包括 bundle 缓存、chunk 缓存和单关数据缓存。这样同一个 bundle 或同一个 chunk 被多次访问时,不需要反复读取资源,可以降低运行时加载开销。对调用方来说,玩法逻辑不再需要关心某一关具体存放在哪个文件里,只需要告诉 LevelRepository 当前要加载普通第几关、每日哪一天、双牛哪一关,或者生存模式第几波即可。
## 同步适配各玩法调用方
主线和双鸡模式通过 LevelRepository 加载对应 displayLevel;每日挑战根据基准日期计算 dayIndex 后加载每日关卡;生存模式根据当前 wave 从对应难度组中抽取关卡。这样四种模式虽然选关规则不同,但最终都统一到同一套资源解析和加载流程中。
目前新的关卡 bundle 结构、索引表和 LevelRepository 加载链路已经接入项目,旧的关卡目录也已经清理。整体来看,项目关卡系统已经从“按目录直接读取资源”的方式,升级成了更完整的“索引驱动 + 分包加载 + 统一仓库管理”结构。
短期来看,这次重构主要解决了外部关卡迁移、多模式加载和资源组织混乱的问题。长期来看,它为后续关卡扩展、小游戏分包、云端关卡下发、资源热更新,以及不同玩法复用同一批关卡数据打下了基础。
# 四.后续规划
- 制作新手教程,帮助玩家理解基础规则、操作方式和关卡目标,降低首次进入游戏时的理解成本;
- 制作设置面板,并接入音效、音乐、震动等相关开关逻辑,补齐基础系统功能;
- 利用 AI 生成适合当前美术风格和玩法节奏的音效资源,并配置到按钮点击、关卡反馈、胜利结算等关键交互中;
- 接入广告 SDK,完善看广告体力恢复、复活、多倍奖励获取等功能的完整链路;
- 使用云服务制作简单的云存档逻辑,优先保障玩家账号数据和关卡进度能够在云端保存,降低设备更换或本地数据丢失带来的影响。