Log Detail

geometry-tower-defense-base Git 变更总结

完成仓库初始化并按依赖拓扑迁移攻击/命中结构体与Tag系统的IDataRow实现,同时将DataTable二进制解析能力下沉到纯C#领域层。

2026/05/01 basil/geometry-tower-defense-base commit: fb2252f6..24c8efe0

L0领域层迁移DataTable二进制解析依赖拓扑重构

geometry-tower-defense-base 开发日志

本周在 L0 Domain 层完成了 5 笔提交,主要干了三件事:把仓库骨架搭起来、按依赖拓扑继续往纯 C# 领域层搬代码、以及把 DataTable 的二进制解析彻底收拢到领域层里。整体方向就是把“能脱离 Unity 的逻辑”一点一点从上层的阴影里拖出来。

干了什么

仓库初始化与分层共识

新增了 .gitignoreCLAUDE.mdTODO.mdCLAUDE.md 除了说清楚项目只能在 Unity Editor 里构建,还写下了 L0(纯 C# 领域层)/ L1(粘合层)等分层的初步约定。有了这份说明,后续成员就不会在“这行代码该放哪”上反复打架。第一波已经完成了 62 个文件(主要是枚举和事件定义),进度在 TODO.md 里用表格记下来了。

第二波:数学库替换与攻击/命中结构体

这一波迁移是按文件间的依赖拓扑决定的,不是谁对哪个模块更熟就先动哪个。前一波已经把枚举事件抽走了,接下来自然就轮到依赖这些定义的攻击相关数据结构。于是把 UnityEngine.Vector3Mathf 全部切到了 System.Numerics,同时落地了 AttackPayloadHitContextTagRuntimeUtility。目前还没有碰到浮点精度不一致或者缺少辅助方法这类问题,不过 System.Numerics 和 Unity 数学库在序列化、哈希上的行为差异迟早要正视,后续准备挑几处关键战斗计算补几个对比用例,防止它们变成哑雷。

第三波:Tag 系统的 IDataRow 实现与规则注册

继续顺依赖链往下推,把 Tag 相关的 IDataRow 实现(RarityTagBudgetRowTagRow)以及生成规则注册表(RarityTagBudgetRuleTagGenerationRuleRarityTagBudgetRuleRegistry)都搬进了 L0。这样一来,L0 层已经可以独立描述“稀有度 Tag 的预算规则和生成规则”,不再需要 Unity 的环境来验证这坨逻辑。

二进制解析彻底下沉到 L0

之前 RarityTagBudgetRow 碰到二进制路径就直接抛异常,这不符合分层的预期。这次补上了 BinaryReaderExtension,把真正的解析逻辑写在了领域层内部,并让 RarityTagBudgetRow 消费它。

为什么不让 L1 胶水层把二进制流转成纯数据结构再交给 L0?胶水层的本职工作就是弥合纯 C# 与 Unity 之间的鸿沟,不应该往里塞业务反序列化的代码。把解析能力留在 L0,领域层才能在不依赖 Unity 的环境(比如服务端模拟或纯单元测试)里直接抱着一个 Stream 完成数据加载,这是领域内聚的考虑,也给以后切分运行时留了一扇门。

代价当然也有:L0 的 DataTable 实现现在对二进制格式变更高度敏感;而且数据文件必须从 Unity 资源管理流程中导出成 .bytes 才能在外部使用,生产工具链还差一截,这是后面必须填的坑。

文档与进度维护

顺便更新了 TODO.md,第三波完成 6 个文件后累计迁移 73 个,总目标约 180 个。CLAUDE.md 也写明了 L0 现在允许引用纯 C# 的 GameFramework.dll,没有 Unity 依赖,避免因为多了个外部 dll 就被当作“不纯净”而误判。

哪些地方埋了雷

  1. GameFramework.dll 的边界
    L0 为了复用 DataTable 基础能力引了 GameFramework.dll,它确实是纯 C# 的。但后续需要盯紧它与 Unity 侧 GameFramework 版本的接口一致性,否则二进制格式一错位,解析就崩了。

  2. 剩余 ~100 个文件的迁移风险
    分波策略是按依赖拓扑而不是按谁熟哪个模块来切,这样每波爆炸半径小,但剩下的文件里,最让人不放心的还是那些藏在深层、隐式依赖了 GameObjectTransform 的类。它们很可能处在依赖链的中下游,平时不起眼,一旦开始迁就会扯出一连串修改,这是后面推进时需要重点关注的地方。

  3. 二进制数据从哪来
    领域层可以读了,但生成二进制的管线还没落实。现在只能靠 Unity 侧喂文件,如果想在服务端或者 CI 里独立跑起来,需要尽快把二进制导出自动化的缺口补上。

接下来

  • 继续按拓扑推进剩余文件迁移,优先揪出那些隐式依赖 Unity API 的“地雷模块”。
  • System.Numerics 切换补上精度对比测试,哪怕没发现明显问题也留个底。
  • 着手搭建二进制数据导出工具,让 L0 能真正脱离 Unity 独立自测。

注:本文由模型 unknown 生成(草稿与终稿同模型)。