# Changelog --- ## [0.11.0] - 2026-06-18 ### Breaking — 发射平台与探测设备分离 - **LaunchPlatformSpec**:新增纯发射平台规格(GunCount/ChannelsPerGun/MuzzleVelocity/CruiseSpeed 等,无探测字段) - **ScenarioUnit.FireUnitSpecId → LaunchPlatformSpecId**:发射平台部署通过新 FK 引用 - **SensorSpec 统一探测来源**:发射平台自带探测 + 独立探测设备,统一通过 SensorSpecId 引用 - **BuildDetectionSources 简化**:只查 SensorSpec,不分 Launch/Detection 两条路径 - **FireUnitSpec 保留不用**:旧类型保留代码但不参与运行时 - **defaults.json +launchPlatforms**:新数据区 ### Added — 代码审查 + 测试覆盖 - **DataServiceTests**:12 个,覆盖 7 类基础数据 CRUD - **死代码清除**:MunitionEntity._hasExceededReleaseAltitude - **Spec 类独立文件**:DroneSpec/FireUnitSpec/SensorSpec 等从 DefaultData.cs 拆出,命名空间 → Models - **PagedResult/EnumMetadata 独立文件** - **GetEnums 返回中英文对照**:EnumItem{Name,ChineseName,Value} - **FormationTemplate 补 PrimaryKey** ### Added — 3D 模型引用 - **DroneSpec/FireUnitSpec/SensorSpec +ModelId**:FK → ModelInfo - **EntitySnapshot +ModelId**:每帧推送给 Unity - **ModelInfo.ModelType→EntityType(枚举) +Description** ### Metrics - 测试 **250**(+12),全部通过 12s --- ## [0.10.0] - 2026-06-18 ### Breaking — 平台物理统一 + 模型重命名 - **空基/地基物理统一**:去除 DefensePlanner 所有平台类型分支,统一用 `InterceptCalculator.Compute`(删 `ComputeHorizontal`),统一用 `MuzzleVelocity`(删 `CruiseSpeed` 分支) - **抛物线选解策略**:两解逐一计算距离匹配 + `fireTime>0` 可行性,选最早拦截的解(非简单选高角/低角) - **`TargetType` → `DroneType`**:删 `Electric`/`Piston`,重编号 `HighSpeed=2`,`TargetConfig.DroneType` 属性同步改名 - **`TargetConfig` → `ScenarioDrone`**:核心模型重命名 - **`SimTask` → `Scenario`**:想定主表重命名,`ScenarioNumber` 取代 `TaskNumber` - **`TaskFullConfig` → `ScenarioConfig`**:聚合配置重命名,`Task` 属性 → `Info` - **`TaskId` → `ScenarioId`**:所有 FK 重命名 - **`ScenarioService` 方法**:`CreateTask`→`CreateScenario`、`DeleteTask`→`DeleteScenario`、`SearchTasks`→`SearchScenarios`、`GetTaskDetail`→`GetScenarioDetail` ### Added — 模型业务属性 - **`ScenarioDrone` / `DroneSpec`**:+`Model`(型号)、+`Description`(描述/用途) - **`Scenario`**:+`Description`(想定描述) - **`ScenarioUnit` / `FireUnitSpec`**:+`Description` - **`ReportManager.Export(reportId, outputDir)`**:支持指定导出路径 ### Changed — 数据库迁移 - `CreateMainTables` 删旧表 `SimTask`、`TargetConfig`、`SimulationReport`(自动重建) - `scenariosVersion` 3→4 触发 demo 想定重建 ### Docs - 对接文档 V1.6:去历史命名对照,只写现状 - 架构设计 V15:同步模型表结构 + 枚举值 ### Metrics - 测试 **238**,全量通过 11s --- ## [0.9.0] - 2026-06-17 ### Breaking — 运动学前向计算 + 基础数据 CRUD - **Kinematics 前向计算**:新增 `ComputeParabolicRange(v₀, θ, Δy)` 和 `ParabolicApex(v₀, θ)`,正问题直接由角度算射程和时间 - **Math.Max 回退全部移除**:`CalculateLaunchAngle`/`ParabolicShellTime`/`ParabolicTimeOfFlight` 不再静默钳位或 45° 回退,非法输入直接抛异常 - **GaussianPuffDispersion / CloudExpansionModel / DetectionCalculator**:BurstChargeKg≤0 抛异常,不再用 `Math.Max(0.01, ...)` 掩护;Phase3 `x≤0` 显式跳过 ### Changed — 空基固定阵位发射 - **空基不再「飞向投放点」**:改为固定阵位水平发射(θ=0°),`ComputeParabolicRange` 前向计算飞行时间 - **DefensePlanner 空基**:`ComputeHorizontal` 使用 `platform.PosY`(非 `ReleaseAltitude`);云团位置 = 炮弹实际到达位置 - **MunitionEntity 下落修正**:`_arrivesDescending` 区分上升/下落到达;`Math.Max(0.01, ...)` 除零回退移除 - **死代码删除**:`CommandFlyTo`/`FlyingToTarget`/`ReadyToRelease` 状态 + SimulationEngine "1b. 到达投放点" 块 ### Added — 实体属性全面暴露 - **EntitySnapshot +VelX/Y/Z**:所有实体帧快照带瞬时速度 - **引擎 Platforms 列表公开**:`SimulationEngine.Platforms` - **CloudEntity**:Pos/Radius/Density/Phase/Elapsed 便捷属性(不再穿透 Dispersion) - **MunitionEntity**:LaunchAngle/Azimuth/MuzzleVelocity/FlightDuration/Start/LaunchTime/ElapsedTime/Velocity 全部 public - **DroneEntity**:TraveledArc/TotalArc/Progress - **PlatformEntity**:Target/FlightDistance/FlownDistance - **DetectionEntity**:PosX/Y/Z ### Added — 基础数据 CRUD(DataService) - **7 类规格入库**:FireUnitSpec / DroneSpec / SensorSpec / EnvironmentSpec / FormationTemplate / RouteTemplate / AmmunitionSpec - **类名规范化**:TargetPreset→DroneSpec, DetectionPreset→SensorSpec, WeatherPreset→EnvironmentSpec, FireUnitTemplate→FireUnitSpec, RoutePreset→RouteTemplate - **IDataService + DataService**:全 CRUD(GetAll/Save/Delete) - **Unity Manager 接入**:ScenarioManager.DataService + SimulationRunner.DataService ### Added — FrameDataStore LiveFrames 内存回放 - **Flush 后保留 LiveFrames 副本**:仿真刚结束可内存回放,零磁盘 IO - **ReplayController 双路径**:`LoadReplay(scenarioId, frameStore)` 优先内存,回退 SQLite - **LiveFrames 生命周期**:BeginRecording/Discard 清除 ### Changed — 3机空基编队测试启用 - `Seed3DronesAirBased` 参数对齐单机(风速/航速),平台沿 X 轴间隔 300m - `Scenario_3DronesAirBased_AllDestroyed` 移除 Skip,全部通过 - `Scenario_DetectionDriven_PlanningDelayedByDetectionBoundary` 移除 Skip ### Metrics - 测试 **243**(+12),跳过 0,全量通过 11s --- ## [0.8.0] - 2026-06-16 ### Added — 探测实时链路(Phase 10) - **3D 球冠探测**:`DetectionCalculator.IsInCoverage`(水平距离 + 俯仰角 + 高度门限),planner 与运行时共用 - **EarliestDetection 采样法**:线段-圆求交改为沿航路采样(步长≤50m)调 `IsInCoverage` - **DetectionEntity**:运行时探测实体 + per-drone 状态机(Undetected ⇄ Detected),Tick 第5步扫描 - **实时探测事件**:`OnTargetDetected` / `SimEventType.TargetDetected` / `PlanningFailed` - **ScenarioUnit + DetectionSource**:+4 个 3D 球冠字段(MinElevation/MaxElevation/MinDetectAlt/MaxDetectAlt) - **默认数据全部加入 3D 球冠参数**(地基 -5°~85°、空基 -80°~30°) ### Added — Planner 诊断 + 拦截点计算 - **InterceptCalculator**:抛物线与直线联立方程求解拦截点(地基可变角度 + 空基固定水平 θ=0°) - **HasInterceptWindow**:拦截窗口可行性检查(从探测边界算有效飞行时间) - **TryGenerateFireEvents**:每个 `return events` 带拒绝原因 - **Planner Summary**:含失败原因 + 建议值(探测范围/弧长/反应时间) - **PlannerConfig**:+`ReactionTime`(5s)/ `ExpansionFactor`(0.9)/ `TimingSafetyMargin`(1s) ### Changed — 消除硬编码 - **速度从 waypoint.Speed 读取**:`DroneEntity.CruiseSpeed` / `GetDroneSpeedKph` 不再用 `ScenarioDrone.TypicalSpeed` - **`AmmunitionSpec` +`Phase2Duration`**(30s):`CloudExpansionModel` 不再写死 `30f` - **`GetArrivalTime` 基于 DetectArc**:从探测点到中点算到达时间(而非航路起点) - **TestData 改为从 seeded 数据库读取**(不再内嵌 JSON 重复 defaults.json) ### Changed — 默认想定参数 - 巡航导弹速度 300→200 km/h - 空基航路 10km→20km,平台位置 1500→6000,巡航速度 55→80 m/s - 地基火力单元放航路终点,探测范围按 80% 规则 ### Metrics - 测试 204 → **231**(+27),全量通过 7s --- ## [0.7.0] - 2026-06-15 ### Breaking — 概念升级:编组拆分 + Group 表移除 - **Group 表移除**:原 `Group` 表(DroneFleet / EquipmentGroup)不再创建。向后兼容保留旧库中的 Group 表,但不再主动读写 - **GroupType 枚举删除**:不再区分 DroneFleet / EquipmentGroup - **GroupService / IGroupService / GroupRepository 删除**:不再需要编组管理服务 - **Unity GroupManager 删除**:不再需要编组管理桥接 ### Changed — 数据模型重命名 - **`GroupId` → `WaveId`**ScenarioDrone 四表的编组外键重命名为批次外键 - **RoutePlan 索引重命名**:`(ScenarioId, GroupId)` → `(ScenarioId, WaveId)` - **RoutePlanRepository / WaypointRepository**:`GetByScenarioAndGroup` → `GetByScenarioAndWave` - **IScenarioService.SaveRoute**:`groupId` 参数 → `waveId` ### Changed — 算法类型重命名 - **`DroneGroup` → `DroneWave`**:AlgorithmTypes、IDefensePlanner、DefensePlanner、SimulationEngine 全部使用新类型名 - **`DroneGroupId` → `DroneWaveId`**:UnitAssignment 中的编队引用 → 批次引用 - **`BuildDroneGroups()` → `BuildDroneWaves()`**:SimulationEngine 构建方法重命名 ### Changed — 文档同步 - 总体架构设计:编组概念升级说明 - DefensePlanner 技术方案:DroneGroup → DroneWave - 实施计划:GroupService 移除、多编队 → 多批次 - Unity 前端对接文档:DefaultDefenseAdvisor → DefensePlanner,SaveRoute 签名更新 - 仿真器实体事件映射:BuildDroneGroups → BuildDroneWaves ### Removed - 7 个文件:Group.cs / GroupRepository.cs / IGroupService.cs / GroupService.cs / GroupManager.cs / GroupServiceTests.cs / GroupRepositoryTests.cs ### Metrics - 测试 208 → **204**(−4,删除 Group 相关测试),全量通过 63s - 0 编译错误,0 编译警告 --- ## [0.6.0] - 2026-06-15 ### Added — 探测驱动的规划(8.1.1) - **DetectionCalculator 静态工具类**:探测能力评估的唯一实现(与 Kinematics/RouteGeometry 同范式)。光电受 Visibility 衰减(`有效=基准×min(1,Visibility/基准)`),雷达/红外不受影响;统一信息网络找最早探测点(线段-圆求交) - **探测源模型**(DetectionSource):独立探测设备 + 火力单元自带探测统一表达(雷达/光电/红外三距离 + 精度) - **ScenarioUnit 扩展**:删单一 `DetectionRadius`,加 `RadarRange/EORange/IRange/DetectionAccuracy` 四字段 - **FireUnit 探测字段激活**:BuildFireUnits 从 ScenarioUnit 读取并赋值(原为死代码) - **planner 接口扩展**:`IDefensePlanner.Plan` 加第 4 参数 `detectionSources` - **PlannerConfig 加 DefaultDetectionAccuracy**(无探测时回退精度) - 单元测试:DetectionCalculator 13 项、探测驱动规划 2 项 ### Changed — planner 基于探测信息规划 - planner 假设威胁从探测边界被发现,到达时间 = (拦截弧长 − 探测弧长)/速度,而非上帝视角的航路起点 - SimulationEngine.Initialize 构建 `List`(独立探测 + 火力单元自带),传入 planner - 报告探测设备表用新字段(雷达/光电/红外/精度) ### Fixed - Solve 健壮性:GenerateFireEventsAt 返回空时(探测边界太靠后来不及拦截)不再 IndexOutOfRange ### Metrics - 测试 193 → **208**(+15),全量通过 64s - 0 编译警告 --- ## [0.5.0] - 2026-06-14 ### Added — 物理模型统一架构 - **RouteGeometry 静态工具类**:航路几何唯一实现(总弧长/弧长→位置/点→最近弧长/切向量/到达时间)。planner(预测)和 DroneEntity(执行)共用,消除本地折线插值 - **PlannerConfig + planner_config.json**:planner 策略参数全部外置(重叠系数、威胁类型系数、弹药匹配表、临界/上限概率阈值)。代码零默认值,文件缺失即抛异常 - 单元测试:RouteGeometry 16 项、PlannerConfig 6 项、DroneEntity L 形多 waypoint 1 项、Z 向航路感知 1 项 ### Changed — planner 不再写本地物理公式 - **DefaultDefensePlanner 航路感知布局**:云团 offset 沿航路切向(`RouteGeometry.TangentAt`),不再写死 X 轴;穿越点用 `RouteGeometry.PositionAt`,到达时间用 `RouteGeometry.TravelTimeTo`——支持任意方向/折线航路 - **云团重叠**:间距从 `2R`(相切)改为 `2R×(1−重叠系数)`,重叠 20% 由配置驱动,消除相切处的密度空洞 - **DroneEntity 弧长驱动**:运动改为 `_traveledArc += speed×dt` + `RouteGeometry.PositionAt`,删除 `CurrentWaypointIndex` 逐段插值、`dist<1.0` 阈值、`step>=dist` snap 丢位移等本地逻辑 - **CloudExpansionModel.RoundsNeeded** 签名:`effectiveRadius` 参数改为 `spacing`,间距由调用方(planner)按重叠系数传入,公式仍在共享模块 - **策略参数从配置读**:威胁类型系数、弹药匹配表、临界概率(0.5)、拦截概率上限(0.95)全部从 `PlannerConfig` 读,planner 内零硬编码 ### Fixed — planner 与引擎物理一致性 - **PathInSphere 云团参考系修正**:毁伤判定改在云团参考系计算(`drone.Pos − cloud.Center`),修正云团在 tick 内移动导致的每 tick ~2m 系统误差 - **ComputeEffectiveRadius 云龄 bug**:从 `ArrivalTime×2`(无人机飞行时间,概念错误)改为 `expansionTime`(云团自身膨胀时长) ### Removed - SimulationEngine 所有硬编码桌面路径的诊断写入(`planner_targets.csv`/`cloud_actual.csv`/`path_in_cloud.txt`/`_hitLog`/`_totalPathInCloud`)——这些造成集成测试并行时文件竞争(flaky 失败根因) - DefaultDefensePlanner 的硬编码 `MatchTable`/`TypeCoefficient` 字典(移入配置) ### Metrics - 测试 167 → **191**(+24),全量通过 41s - 关键验证:活塞+西风、空基+东风有风场景击毁成功;Z 向航路云团沿航路分布;L 形折线多 waypoint 运动正确 --- ## [0.4.1] - 2026-06-14 ### Added - 天气纳入 Planner 规划:抛撒点风偏预补偿。云团生成后会在 `expansionTime` 内被风吹偏 `windVec × expansionTime`,Planner 逆风预置抛撒点 `cloudGen = 穿越点 − windVec × expansionTime`,使云团漂移后中心正好回到无人机航路上 - 单元测试:`DispersionModelTests` Phase3 天气差异 2 项(雾 vs 晴、夜 vs 晴);`DefensePlannerTests` 风偏补偿 4 项(无风/东风/西风/北风方向性) ### Fixed - `GaussianPuffDispersion.Tick` Phase3 写死 `WeatherType.Sunny` 的 bug:原代码 `GetStabilityClass((WeatherType)0, windSpeed)` 导致任何天气下扩散行为都相同,预估(`CloudExpansionModel` 已正确读 env)与运行时模型不一致。改为存储 `env` 字段,使用真实 `env.WeatherType` ### Changed - `DefaultDefensePlanner.GenerateFireEventsAt` 区分无人机穿越点 `tx,tz`(用于 `txArrival` 计算)与云团生成点 `cloudGenX,Z`(弹药瞄准目标 + FireEvent 输出) - 移除 `Solve` 中 `e.TargetX = mid.X + offset` 的覆盖(会抹掉风偏补偿;多发散布偏移已由 `targetOffset` 参数处理) --- ## [0.4.0] - 2026-06-13 ### Added - 路径积分毁伤判定:`DamageAssessment.PathInSphere` 替代离散 `ContainsPoint`,无人机穿云暴露精确计算 - 损伤模型暴露所需暴露时间:`IDamageModel.RequiredExposureSeconds`,Planner 从损伤模型读取所需覆盖时长 - 云团膨胀独立模块:`CloudExpansionModel`,封装 `RadiusAt`/`DensityAt`/`TimeToReach`/`TimeToDensity`/`RoundsNeeded` - 单元测试:`DamageAssessment` 5 项 (穿心/相邻/间隙/9 链/跨云)、`Kinematics` 抛物线 4 项 (45°标准公式验证) - 密度阈值统一:引擎处 `cloudDensity >= ammo.EffectiveConcentration` 统一检查,三个损伤模型去掉各自硬编码阈值 ### Changed - Planner `CalcRoundsNeeded` 从硬编码 `2:6s` 改为 `_damageModel.RequiredExposureSeconds` - `CloudExpansionModel.RoundsNeeded` 间距 `= 2R`(消除 `1.5f` 魔法数字) - `FireUnit` = 物理单元(不拆通道),Planner 一辆车发一条线 - `MunitionEntity.HasArrived` 上升段触发(不再要求下行),附带精确插值 - 空基平台投放逻辑:飞向云位、距目标 `driftDist` 释放、位置插值保留 - 仿真场景缩短:Piston 5km/150km/h、Jet 5km/200km/h、AirBased 10km/150km/h,全量 22s ### Fixed - 抛物线弹道精确求解:`CalculateLaunchAngle`/`ParabolicShellTime` 解 tan(θ) 二次方程取平射解 - 空基 `PlatformEntity` 投放时不再传送到终点 - 缺失 `else` 导致空基走地基分支 - `Event.OccurredAt` 使用精确 `FireEvent.FireTime`/`m.ArrivalTime` - `_frameDb.Commit` 批量 50 帧 - 报告火力单元计数(`_entityCounter` 重置) ### Removed - `ComputeEffectiveRadius` 公式转移到 `CloudExpansionModel` - 损伤模型内部浓度阈值(`TriggerThreshold`/`EffectiveThreshold`) - `CalcRoundsNeeded` `/2` 魔法加 1 ### Added - DefensePlanner 防御规划引擎:五步流水线(威胁排序 → 弹药匹配 → 候选生成 → 贪心分配 → 时序生成) - 空基平台飞行与投弹:状态机(Idle → FlyingToTarget → ReadyToRelease),载机速度继承,弹药抛物线下落 - 火力单元通道模型:GunCount × ChannelsPerGun,ChannelInterval 物理间隔,Cooldown 冷却 - 默认火力单元配置:4 种模板(轻型/标准/重地基 + 标准空基 8 通道) - 推荐算法统一处理空基/地基平台类型 - 物理间隔错开发射:发射间隔 = 云团直径 / 无人机速度 - 每发弹按目标点位置独立计算到达时间 - 报告显示 per-unit 发射数 + 事件标注火力单元 ### Changed - IDefenseAdvisor → IDefensePlanner:统一输入 `List` + `List` - FireUnit 重构:统一表达空基/地基平台(Type/Position/GunCount/ChannelsPerGun) - SimulationEngine 内部调用 Planner 自动生成发射计划 - MunitionEntity 空投使用 Kinematics.AirDropPosition(继承载机速度 + 重力) - PlatformEntity 加入 CurrentVelocity 属性 ### Fixed - 同平台多弹 FireTime 相同导致冷却跳过:FireTime += i × Cooldown - 同平台弹药飞行时间按目标位置变化被吃掉:统一用中心点飞行时间 - recommendedTiming 按每发目标点独立计算(非中点) - 空基 FireEvent.MuzzleVelocity 错误写 800 - SQLite domain reload 崩溃:SqliteConnectionTracker + AssemblyReloadEvents.beforeAssemblyReload ### Removed - IDefenseAdvisor / DefaultDefenseAdvisor / RecommendMultiGroup - SimulationRunner.BuildFireSchedule fallback - 所有硬编码默认值(55f/800f/1000f/+500f/0.1f clamp) - 所有静默 fallback(null return/empty events) - Models.SimEvent 死代码 --- ## [0.2.0] - 2026-06-12 ### Added - 三阶段气溶胶扩散模型(爆轰膨胀 → 湍流扩散 → 高斯扩散) - 防御推荐算法:根据弹药规格自动计算齐射数、间距、拦截概率 - 仿真引擎事件驱动:OnMunitionLaunched / OnCloudGenerated / OnDroneDestroyed 等 6 个事件 - FireSchedule 发射计划:推荐方案直接生成,引擎执行 - 多编队多批次支持:RoutePlan 多航路、RecommendMultiGroup 火力分配 - 仿真报告:七章结构(结果/环境/目标/推荐/部署/时序/时间线),自动导出 Markdown - 数据库种子:首次建表自动从 JSON 导入弹药规格 - 帧数据 TTL 清理(6 个月过期自动删除) - 仿真加速:TimeScale 支持 - Unity Manager 桥接层:ModelManager / ScenarioManager / SimulationRunner / ReportManager / ReplayController / GroupManager - Unity 全流程验证:一键菜单验证 7 个模块 - 边界测试:空部署 / 强风 / 超长航路 / 空基弹药 ### Changed - 仿真引擎重构为纯执行器,不包含决策逻辑 - RoutePlan 主键改为 Id,支持多编队 - 弹药参数改为 JSON 文件配置 - 报告结构重组,结果前置 ### Fixed - 弹药飞行时间用真实弹道计算 - 云团生成位置使用目标坐标 - 编队偏移应用到初始位置 - Edit 模式下 AddComponent 不触发 Awake --- ## [0.1.0] - 2026-06-11 ### Added - 项目初始化:.NET Standard 2.1 类库 + xUnit 测试框架 - 数据模型(11 张业务表 + 2 张运行时表) - SQLite 持久化 + 任务分库架构 - 想定管理(5 步配置 CRUD) - 仿真引擎基础框架