geometry-tower-defense/docs/MapEntityArchitecture.md

148 lines
4.4 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.

# MapEntity 设计规范(开发约束)
最后更新2026-03-02
## 1. 目标与边界
`MapEntity` 现在是战斗地图域的编排层orchestrator目标是
- 对外暴露地图能力(格子查询、路径查询、建造操作入口)。
- 在 Unity 生命周期中初始化/清理各子服务。
- 承担输入与 UI 用例的连接,不承载具体业务算法细节。
`MapEntity` 不应再直接实现以下细节:
- Tile 扫描与路径缓存算法。
- 防御塔映射字典的增删改查细节。
- 选中状态与攻击范围显示细节。
- 鼠标拾取与 `CombatSelectFormUserData` 组装细节。
---
## 2. 模块划分(当前标准)
### 2.1 MapEntity编排层
文件:`Assets/GameMain/Scripts/Entity/EntityLogic/MapEntity.cs`
职责:
- 生命周期编排:`OnInit / OnShow / OnUpdate / OnHide`
- 子服务初始化与清理
- UI 用例绑定(`CombatSelectFormUseCase`
- 将输入结果分发到选择器/建造器
### 2.2 MapTopologyService地图拓扑层
当前文件:`Assets/GameMain/Scripts/Scene/Map/TowerPlacementService.cs`(同文件内)
职责:
- 扫描 Tilemap构建 `PathCells` / `FoundationCells`
- 缓存 `Spawner -> 默认路径`
- 提供路径查询:
- `TryGetNearestPathCell`
- `TryGetDefaultPathCells`
- `TryFindPathCells`
- `TryFindPathWorldPoints`
约束:
- 只处理“地图拓扑与路径”不处理经济、建塔、UI。
### 2.3 CombatSelectInputService输入解析层
文件:`Assets/GameMain/Scripts/Entity/EntityLogic/CombatSelectInputService.cs`
职责:
- 鼠标屏幕坐标 -> 世界坐标
- 判定点击对象类型(`None/Foundation/Tower`
- 组装 `CombatSelectFormUserData`
约束:
- 只读上下文,不改变游戏状态。
- Foundation/Tower 点击时UI 定位由 Cell 中心决定(稳定定位)。
### 2.4 TowerPlacementService塔部署层
当前文件:`Assets/GameMain/Scripts/Scene/Map/TowerPlacementService.cs`
职责:
- 建造 / 升级 / 销毁(含升级失败回滚)
- 维护塔映射状态:
- `foundationCell -> towerEntityId`
- `towerEntityId -> foundationCell`
- `towerEntityId -> towerStats`
- 提供整局清理接口
约束:
- 仅处理塔生命周期与映射,不处理选中态和 UI。
### 2.5 TowerSelectionPresenter选择展示层
文件:`Assets/GameMain/Scripts/Scene/Map/TowerSelectionPresenter.cs`
职责:
- 维护当前选中对象
- 根据选中状态切换攻击范围显示(通过 `DefenseTowerEntity.SetAttackRangeVisible`
约束:
- 不做建造/升级/销毁。
---
## 3. 运行时主流程(简版)
1. `MapEntity.OnInit` 初始化 4 个服务:
- `MapTopologyService`
- `CombatSelectInputService`
- `TowerPlacementService`
- `TowerSelectionPresenter`
2. `MapEntity.OnShow` 刷新地图拓扑,配置 UI action。
3. 每帧 `OnUpdate`
- 采集输入InputService
- 更新选中对象SelectionPresenter
- 打开/刷新 UI
4. UI Build/Upgrade/Destroy action 回调:
- 通过 PlacementService 改变塔状态
- 通过 SelectionPresenter 同步选中和范围显示
5. `OnHide`
- 关闭 UI
- 清理塔实体
- 清理拓扑/选择/映射运行时状态
---
## 4. 核心不变量(必须保持)
1. `MapEntity` 只编排,不承载业务细节实现。
2. `TowerPlacementService` 是塔映射状态的唯一写入口。
3. `MapTopologyService` 是 Path/Foundation 数据的唯一来源。
4. “当前可见攻击范围”同一时刻最多一个塔。
5. 清场顺序固定:先隐藏塔,再清空映射与选择,再清理拓扑缓存。
---
## 5. 扩展开发规范
### 5.1 新增地图规则(地形、禁建、动态阻挡)
优先改 `MapTopologyService`,不要直接改 `MapEntity`
### 5.2 新增建造规则(费用、限制、回滚策略)
优先改 `TowerPlacementService`,不要在 `MapEntity` 写分支。
### 5.3 新增点击交互或 UI 定位策略
优先改 `CombatSelectInputService`
### 5.4 新增选中表现(特效、描边、信息面板联动)
优先改 `TowerSelectionPresenter`
---
## 6. 代码变更检查清单PR 自检)
1. 是否把新业务放进了对应服务,而不是 `MapEntity`
2. 是否破坏了“服务唯一写入口”不变量?
3. Build/Upgrade 失败是否有完整回滚和金币返还?
4. 清理路径是否覆盖了 `OnHide` 与重进地图场景?
5. `dotnet build GeometryTD.sln` 是否通过?