小地图系统 R24 独立评审报告
评审前置:紧急恢复操作
发现并修复 CRITICAL 级别文件损坏:
Assets/_Game/Scripts/World/Map/TeleportService.cs 文件大小为 0 字节(空文件),R23-N3 修复重复 [DefaultExecutionOrder] 属性时操作失误导致整个文件内容被清空。已完整重建(135 行),包含:
[DefaultExecutionOrder(-400)] 执行顺序
ISaveable 实现(readonly + Clear/foreach 模式,与 MapManager 对称)
ITeleportService 完整接口(CanTeleportTo / RequestTeleport / NotifyTeleportCompleted / UnlockTeleportStation)
- 单例保护 / ServiceLocator 注册/注销生命周期
R23 修复落地验证
| 项目 |
验证结果 |
N1:MapPanel.UnsubscribeServices 补意图注释 |
✅ L158-160 三行注释存在 |
N2:MatchesRoomType 方法 + 搜索逻辑增强 |
✅ L590-601 方法存在;L325 搜索逻辑包含枚举名匹配 |
N3:TeleportService 补 [DefaultExecutionOrder(-400)] |
✅ L18 存在(文件重建后) |
R24 全面评分
架构设计(满分 25 分)
| 细项 |
分数 |
说明 |
| 接口隔离与服务定位 |
10/10 |
4 个服务接口(IMapService/IPinService/ITeleportService/IPlayerPositionProvider)完整分层 |
| 执行顺序链 |
10/10 |
-700→-600→-500→-400→0 完整 |
| 事件驱动与 Dirty 标记 |
9.5/10 |
_servicesReady 双路短路对称;OnEnable dirty 补偿一致 |
| 小计 |
29.5/30 |
|
性能(满分 25 分)
| 细项 |
分数 |
说明 |
| 对象池(Cell/Pin/Exit) |
10/10 |
三池两组件对称;readonly 防泄漏 |
| 索引与查询 |
10/10 |
空间索引 O(1);_regionCache;PinsVersion 脏检查 |
| 每帧开销控制 |
9.5/10 |
_servicesReady 短路;MapProgressDisplay.Refresh 区域计数未缓存(非关键路径) |
| 小计 |
29.5/30 |
|
编辑器扩展(满分 20 分)
| 细项 |
分数 |
说明 |
| 功能完整性 |
10/10 |
拖拽/缩放/验证/搜索(RoomId+RegionId+RoomType)/图例/Undo 全部到位 |
| 策划友好度 |
9/10 |
三维搜索已就位;缺搜索框清除按钮(细节) |
| 小计 |
19/20 |
|
代码质量(满分 20 分)
| 细项 |
分数 |
说明 |
| DRY / 单一职责 |
10/10 |
MapServiceExtensions 集中共享逻辑;ChooseDisplayIcon 单入口 |
| 防御性编程 |
9.5/10 |
ISaveable 防御拷贝三处对称;OnValidate 自动 Trim;格式异常回退 |
| 小计 |
19.5/20 |
|
综合
| 维度 |
得分/满分 |
| 架构设计 |
29.5/30 |
| 性能 |
29.5/30 |
| 编辑器扩展 |
19/20 |
| 代码质量 |
19.5/20 |
| 总分 |
97.5/100 |
R24 识别问题
C1(CRITICAL):TeleportService.cs 被清空 — 已修复
见报告开头,已重建。
N1(已修复):RequestTeleport 使用 CurrentRegionId 而非 CurrentRoomId
位置:TeleportService.cs RequestTeleport 方法
问题:源传送位置应是"源房间 ID",原重建代码误用 IMapService.CurrentRegionId(区域级)。
修复:缓存 _playerProvider(IPlayerPositionProvider),使用 _playerProvider?.CurrentRoomId。
N2(信息级):MapInputHandler._zoom 与 _panel.CurrentZoom 双重状态
位置:MapInputHandler.cs L31(_zoom 字段)vs L79(_panel.CurrentZoom)
描述:两值在 OnEnable 同步一次后始终一致(OnScroll 写 _zoom → _zoomTarget.localScale;CurrentZoom 读 _zoomTarget.localScale.x),但代码结构给读者造成"双份状态"的误解。
当前状态:功能正确,逻辑成立,但可读性可提升。不修复(风险高于收益)。
N3(信息级):编辑器搜索框缺清除按钮
位置:MapLayoutEditorWindow 工具栏
描述:无一键清空搜索文本的 × 按钮,策划需手动删除。
当前状态:体验细节,不影响功能。
评分历史
| 轮次 |
评分 |
| R17 |
93.0 |
| R18 |
93.8 |
| R19 |
93.8 |
| R20 |
94.2 |
| R21 |
95.0 |
| R22 |
96.5 |
| R23 |
97.5 |
| R24(修复后) |
97.5 |
剩余开放改进点(信息级)
MapProgressDisplay.Refresh() — 区域探索计数未缓存(每次 OnExplorationChanged 重新遍历 rooms 数组);规模小时无影响,可考虑缓存 exploredCount 使其与 _exploredRooms 同步更新
MapInputHandler._zoom — 可删除 _zoom 字段,全部读 _panel.CurrentZoom(需要验证 OnScroll 的初始值逻辑)
- 编辑器搜索清除按钮(N3)
- MapPanel / MinimapHUD 颜色三元组各自独立 Inspector 配置,无共享 ScriptableObject(功能正确,无视觉不一致风险)