Log Detail

vampire-like Git 变更总结

重构仿真管线拆分碰撞广域查询与数据通道,新增长枪武器并实现矩形戳刺攻击,同时修复安卓打包及多项资源构建配置冲突。

2026/04/09 basil/vampire-like commit: 2d822c02..b79d4824

仿真管线重构新武器长枪构建与配置修复

vampire-like 开发日志(2026-03-17 ~ 2026-04-09)

概述

这一轮主要在三个方向发力:把仿真系统的运行骨架进一步收紧、新增长枪武器并打磨其攻击手感,以及顺手清掉前一阵积压的构建和配置问题。另外也开始引入 OpenSpec 和 Claude Code,试图让后续的改动能带着“当时为什么这么设计”的上下文一起流动。

仿真管线:拆开是为了跑得更快

之前 SimulationWorld 里碰撞管线和其他数据通道都挤在一起,每次做一次 Tick 都要经过一串难以并行化的调用。这次拆出 CollisionBroadPhase,把碰撞的粗筛阶段独立成 Burst Job,纯粹是出于性能上的考虑。现在碰撞查询可以和其他敌人移动、分离计算更自由地拼 Job 依赖链,不再被主线程的步调拖着走。

同时把 JobDataChannel 里那些碰撞瞬态和敌人分离数据也单独剥了出来(CollisionTransient / EnemySeparationTemporal),让数据通路一看就知道哪些是只读瞬态,哪些是跨帧保留的。这样一来,SimulationWorld 本身现在就只是编排者——持有数据、负责创建和调度 Job,但不再自己干每个步骤的脏活累活。Tick 仍然是唯一入口,这点没有变。

拆的过程中要注意的一个坑是 Job 依赖链的衔接:如果某个 Job 里用到的 NativeContainer 是另一个还未调度的 Job 写出来的,很容易出现“创建时没问题、跑起来才黑屏”的次序错误。本地测下来依赖顺序还稳定,但后续加新的 Job 时必须保证在 SimulationWorld.RuntimeModules 里注册的 Schedule 逻辑不破坏这个链条。

旧版的 EnemySeparationSolverProvider 也在这次被彻底移除,敌人分离完全走 Burst 实现了,不再需要分支去判断“用新仿真还是旧分离器”。

新武器长枪:矩形区域才是“戳”的感觉

长枪的攻击方式显然应该是往前戳一个矩形区域,而不是之前圆形或扇形那一套。因此在武器参数上做了一次比较彻底的调整:把 hitRadius / thrustDistance 这套给换掉,改成 hitHalfWidthpierceLengthhitHeighthitCenterYOffset,让攻击判定能精确描述一个矩形戳刺体。

带参数的 JSON 也趁机统一了一下键名的大小写(SectorAnglesectorAngle),算是个顺带的清理。WeaponBase 里新增了 TryQueueRectangleCollisionQuery,专门为这类矩形攻击服务;LanceThrustAttackEffect 只是用它发起查询,具体的命中结果交给碰撞管线去消化。

目前局部测试没发现明显的穿透或漏检,但这跟敌方碰撞体尺寸和对矩形半宽配置很敏感,后面要多用不同体型的敌人测一下,尤其那些高速冲过来的小东西。

构建与资源:安卓打包终于不梗了

这次修安卓打包时花了不少时间在配置文件的冲突上。ResourceBuilder.xmlResourceCollection.xml 在之前的合并里被打上了冲突标记,InternalResourceVersion 也来回蹦(0→5→1),一看就是多人/多分支协作时没留意到这些配置会被整体覆盖。最后手动统一了一版,顺带把输出目录、构建事件处理器名称等改成 VampireLike 自己的类型名。

.gitignore 之前误把 /Assets/StreamingAssets 全局踢出去了,导致安卓打包时 StreaminAssets 下的东西没进去,也一并修掉。另外加入了 TMPro.cginc,解决字体 Shader 在打包后的缺失问题。

代码清理与测试修补

IsSimulationMovementEnabled 这种仿真/非仿真双分支的痕迹扫了一遍,现在敌人移动完全由仿真世界接管,去掉那些“如果不是仿真就自己跑 Update”的历史遗留。EnemyProjectile 里驱动相关的字段也一并删掉,逻辑清爽不少。

MovementComponent 补了个 IsMoving 属性方便外部查询状态,调试面板里去掉了已废弃的分离求解器控制项。测试这边,TransformSync 的空引用检查和 EntitySync 的事件订阅重复问题都修了,SimulationWorldTickTests 也根据最新行为调整了断言,起码现在编辑模式下跑起来不红了。

工具与规范:让设计意图别只烂在人脑子里

在之前几次修改现有模块(比如碰撞管线或武器系统)时,明显感觉到缺少记录“这个设计是出于什么考虑”的习惯,导致一段时间后再触碰相同代码时只能靠猜。这次引入了 OpenSpec 和 Claude Code 的 opsx 命令集,目的就是让每次改动可以沉淀下设计要点和权衡,留给未来的人(包括自己)在扩展现有模块时能快速拿到当时的上下文,减少因为理解偏差造成的返工。

配合这些,UI 五层架构的规范也更新了,并生成了一个 ui-five-layer-architecture skill,打算后面新做的 UI 都按这个切分来组织。

后续我会盯着的地方

  • 仿真 Job 依赖:目前拆分出的 Job 都能正常跑完,但随着后续再往里塞新的计算(比如新武器相关的判定),要确保 RuntimeModules 里的调度次序不会产生隐式的数据竞争或泄漏。
  • 长枪的碰撞鲁棒性:针对快速移动的小体型敌人再集中测一轮,矩形碰撞和粗筛的交互可能会有边界情况的漏检。
  • 资源构建稳定性ResourceBuilder.xml 这类经常变动的配置最好能在 CI 里加一次差异检查,避免再出现合并冲突或版本号错乱。
  • 测试覆盖:后续每次改仿真逻辑或武器技能时,顺手补上对应的 Edit/Play 测试,不要等出问题了再补锅。
  • OpenSpec 落地:新做的变更能不能持续往 openspec/changes 里写总结,这比工具本身更重要。

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