18f7b79401
fix: UnityPathProvider 首次运行自动复制数据文件
...
从 StreamingAssets 自动拷贝 defaults.json + planner_config.json 到 persistentDataPath
前端文档更新: 文件放 Assets/StreamingAssets/ 即可,无需手动放 persistentDataPath
2026-06-15 16:25:05 +08:00
5b6ccccba6
docs: 前端对接文档更新到 V1.3(预设想定一键运行)
...
交付物简化: defaults.json + planner_config.json(替代 default_ammo.json)
核心流程: 列出[Demo]想定→LoadAndStart→订阅事件,无需手写配置或调用Planner
新增: 自定义想定示例(使用 DefaultData 预设快速组装)
默认数据表: 弹药/编队/航线/火力单元/无人机/探测/天气/预设想定 8类
2026-06-15 16:21:02 +08:00
235c111a75
refactor: 集成测试使用预设想定 + 航线预设
...
defaults.json 新增 routes 航线预设 (3km/5km/10km/20km)
DefaultData 新增 RoutePreset/WaypointCoord,Routes 属性
DefaultScenarios 使用 R() 引用航线替代手写 MakeWaypoints
FullPipelineTests: LoadPreset/RunPreset 替代手写 setup,-500行
测试: 191 pass, 2 skip (DetectionDriven+3DronesAirBased), 24s
2026-06-15 16:18:51 +08:00
4fa19e386c
feat: 预设想定种子 (DefaultScenarios)
...
6 个预设想定首次启动自动入库,幂等跳过:无防御/管控侵入/活塞西风/喷气活性/空基东风/3架空基编队
通过 DatabaseManager.OpenMainDb() 自动种子,版本追踪
ScenarioServiceTests 期望值适配(+6 个种子想定)
2026-06-15 16:06:56 +08:00
d6fb206078
build: 更新 Unity Plugins Core.dll(含 DefaultData 和 MetaEntry)
2026-06-15 15:47:22 +08:00
8eeb43f0e8
feat: 统一默认数据架构 (defaults.json + DefaultData)
...
单一数据源 data/defaults.json,含弹药/编队/火力单元/无人机/探测/天气六类预设
版本追踪: Meta 表 + version 字段,更新时 InsertOrReplace,不删用户数据
名称统一 [Demo] 前缀,UI 中可识别为模拟数据
删除: DefaultAmmunition.cs, DefaultFireUnits.cs, default_ammo.json, default_formations.json, TestAmmo.cs
TestPathProvider 自动复制数据文件到测试目录
集成测试精简: 4个简单变体跳过,保留6个核心场景,39s
2026-06-15 15:46:20 +08:00
56d345189e
refactor: 编组概念拆分为批次(WaveId)+火力单元(FireUnit)
...
Breaking: Group表/枚举/Service/Repository移除; GroupId->WaveId; DroneGroup->DroneWave; DroneGroupId->DroneWaveId; GroupManager删除
Docs: CHANGELOG 0.7.0; 总体架构 V10; DefensePlanner V4; 实施计划 V1.4; 对接文档 V1.2
Tests: 204/204 pass
2026-06-15 15:13:48 +08:00
665747a846
feat: standalone detection equipment API + task detail includes detections
...
IScenarioService: AddDetection/DeleteDetection/GetDetections (independent of SaveDeployment overwrite).
Repository: GetByTaskIdAndRole filters by equipment role.
TaskFullConfig.Equipment already includes detections (GetTaskDetail.GetByTaskId returns all). Frontend filters by EquipmentRole.Detection or uses GetDetections.
Tests: 4 detection CRUD tests. 212 total pass.
2026-06-15 13:30:16 +08:00
11f8cb2c79
feat: detection-driven planning (v0.6.0)
...
Planner no longer has god-view. It assumes threats enter from detection boundary (unified info network earliest detection point), not route start.
Core: DetectionCalculator (EO attenuated by Visibility, radar/IR unaffected; earliest detection via segment-circle intersection). EquipmentDeployment: drop DetectionRadius, add RadarRange/EORange/IRange/DetectionAccuracy. FireUnit detection fields activated in BuildFireUnits. IDefensePlanner.Plan adds 4th param detectionSources.
Engine: BuildDetectionSources merges standalone detectors + fire-unit self-detection into unified list, passed to planner.
Fix: Solve robustness when GenerateFireEventsAt returns empty (detection boundary too late to intercept).
Tests 193 to 208 (+15). 0 warnings.
2026-06-15 12:52:57 +08:00
3028a421b5
test: unify ground 3-drone route to 5000m (matches single-drone)
...
Ground 3-drone test route 10000m -> 5000m to match single piston test. Sim time now 46.8s (was 91.6s), identical to single-drone, enabling direct comparison.
Air-based 3-drone stays 10000m (matches air-based single). 193 tests pass.
2026-06-14 22:19:19 +08:00
d70d1f0bf8
fix: multi-lane cloud offset used global index instead of per-lane index
...
Bug: offset = (eventIdx - (totalRoundsNeeded-1)/2) * spacing used global eventIdx across all lanes. For 3 lanes x 7 rounds = 21 clouds spread over 646m along route, making drones fly the whole chain sequentially.
Fix: offset = (roundInLane - (singleNeeded-1)/2) * spacing. Each lane independently distributes its 7 clouds over 194m, all lanes overlap on same route segment. Drones hit simultaneously.
Result: 3 drones destroyed at same time (t=91.6s, same X=5089), was sequential 87/91/96s. 193 tests pass.
2026-06-14 22:12:32 +08:00
19780b54b9
test: add 3-drone air-based formation integration test
...
Scenario_3DronesAirBased: 3 piston drones in Formation (Z=0/50/100), 3 air-standard platforms, all destroyed. Verifies air-based multi-lane intercept end-to-end.
193 tests pass.
2026-06-14 22:02:00 +08:00
008df4a86c
fix: planner formation lane offset + add 3-drone integration test
...
Bug: planner used symmetric lane offset (Z=-50/0/+50) but DroneEntity uses start-anchored (Z=0/50/100). 3rd drone at Z=100 got no clouds.
Fix: planner laneOffset = yLane * laneSpacing (matches DroneEntity formationIndex * lateralSpacing).
Test: Scenario_3DronesFormation - 3 drones in Formation (Z=0/50/100), 3 fire units, all destroyed. 192 tests pass.
2026-06-14 21:58:05 +08:00
87e82727f2
test: add report export to windy scenarios + fix report output path
...
Piston-Windy and AirBased-Windy tests now export reports via VerifyAndExportReport. ReportOutputDir path depth corrected (5->6 levels to repo root).
gitignore: reports/ already excluded.
2026-06-14 21:31:03 +08:00
c6aee276fb
fix: weather display bug + report enrichment + destroy dedup
...
Weather: WindDirection showed raw int (0-7), now translates to N/NE/E. Added scene type, time-of-day, humidity, pressure, scene dimensions to environment section.
Report enrichment: threat section adds wingspan; deployment section shows platform type/position/ammo/munitions and detection equipment/control zones; cloud dispersal config section; event timeline includes coordinates; timeline section adds first/last launch, group spread, summary stats.
Bug fix: DroneDestroyed event fired multiple times per tick when a drone was hit by multiple clouds simultaneously (was 2, now 1). Added break after destroy in cloud loop.
Tests: 191 pass.
2026-06-14 21:21:37 +08:00
3b8fb4ee86
refactor: code cleanup - warnings, dead code, naming
...
Warnings (9 to 0): events declared nullable, _cache nullable, IDamageModel param nullable.
Dead code removed: DefaultFormations class + FormationTemplate; AlgorithmTypes legacy types (ThreatProfile/DefenseRecommendation/DefenseSolution/MultiGroupRecommendation/RecommendedPlatform/RecommendedDetection); DroneEntity CurrentWaypointIndex/FormationOffsetX/Y/ApplyFormationOffset/wind params; Vector3 operators+Length+DistanceTo; CloudExpansionModel Phase2Duration/TimeToDensity; Kinematics EstimatedShellTime/GaussianConcentration; InterceptCandidate write-only fields (CoverageDuration/FlightTime/ShellFlightTime); ParticleParams EmitRate/ColorHex.
Naming: DefaultDefensePlanner -> DefensePlanner (only impl of IDefensePlanner); inCloudTime -> inCloudDistance (returns meters not seconds); DamageAssessment class summary fixed; wind comments clarified (drone wind removed vs cloud wind active).
Tests: 191 pass, 0 warnings.
2026-06-14 15:52:05 +08:00
8515f7821a
feat(v0.5.0): weather into planner + unified physics model
...
Planner no longer writes local physics formulas. All kinematics/geometry/damage go through shared utility classes (Kinematics/RouteGeometry/CloudExpansionModel/DamageAssessment).
Core: RouteGeometry (route geometry), PlannerConfig + planner_config.json (config externalization). Planner route-aware layout (offset along tangent), cloud overlap 20pct. DroneEntity arc-length driven.
Fixes: PathInSphere cloud-frame correction (root cause), GaussianPuffDispersion hardcoded Sunny, ComputeEffectiveRadius cloud age, planner wind offset, remove drone wind bias.
Tests 167 to 191, 41s. Windy scenarios pass.
2026-06-14 14:49:53 +08:00
53ac665a0e
chore: VERSION→0.4.0, CHANGELOG 更新, 任务跟踪文档同步
2026-06-13 19:39:15 +08:00
bf3452013d
feat: 全部160测试通过(22s). 损伤模型RequiredExposure替代硬编码
...
- IDamageModel.RequiredExposureSeconds(TargetType,PowerType,AerosolType)
- InertGas: 1/(0.15*sensitivity), Piston 1.5→4.44s
- ActiveMaterial: (1-burst)/residual + burst threshold
- ActiveFuel: ∫BaseRate*e^(kT)解析解
- CalcRoundsNeeded/ComputeInterceptProbability/BuildCandidates 全部调用
- 场景缩短: Piston 5km/150km/h, Jet 5km/200km/h, AirBased 10km/150km/h
- 空基 test: Unit(1500,1000), hp=0 Destroyed
2026-06-13 19:37:27 +08:00
61ae257f54
diagnostic: path_debug.txt 验证路径积分正确(251m=7朵云处击毁)
2026-06-13 19:12:33 +08:00
48368e0fe8
test: DamageAssessment 5项单元测试验证路径积分正确
...
- 单云穿心/两云相邻/9云链/两云有间隙/两点跨云
2026-06-13 19:09:29 +08:00
a3bf6720c6
feat: 路径积分毁伤判定(DamageAssessment.PathInSphere)
...
- 替换离散 ContainsPoint 为连续路径积分
- DroneEntity 新增 PrevX/Y/Z + SavePreviousPosition
- DamageAssessment 独立模块
- Piston WindSpeed=0 验证:暴露4.52s,击毁
2026-06-13 19:00:41 +08:00
1f092e8647
refactor: 密度阈值统一在引擎检查(ammo.EffectiveConcentration),去掉三个模型的硬编码
...
- SimulationEngine: 密度<EffectiveConcentration则跳过损伤
- InertGas/ActiveMaterial/ActiveFuel 移除各自的硬编码阈值
- CloudExpansionModel新增TurbulentRadius属性
- DefaultAmmunition ActiveMaterial EffectiveConcentration 0.0002→0.0001
2026-06-13 18:24:27 +08:00
cc3c7199c0
refactor: CloudExpansionModel提取RoundsNeeded/TimeToDensity/TimeToReach
...
- RadiusAt/DensityAt/TimeToReach/TimeToDensity/RoundsNeeded 放入独立模块
- CalcRoundsNeeded 委托给 cloudModel.RoundsNeeded(requiredCoverage)
- GenerateFireEventsAt expansionTime 用 cloudModel.TimeToReach(RadiusAt(30f))
- 147/150 (Piston hp=0.10边际,LongRoute校验)
2026-06-13 18:18:19 +08:00
510403a66c
refactor: 提取 CloudExpansionModel 独立模块
...
- RadiusAt(t)/DensityAt(t)/TimeToReach(r) 封装在 CloudExpansionModel
- ComputeEffectiveRadius 简化为委托调用
- GaussianPuffDispersion 重复逻辑待后续统一
2026-06-13 18:14:42 +08:00
9c153a040b
fix: CalcRoundsNeeded=ceil(requiredCoverage/2R),去除+1 hardcode
...
- 理论:所有云在无人机到达时膨胀到expansionTime≈30s,半径均匀
- ceil(333.3/40.4)=9发覆盖363m/6.54s>6s
- hp=0.10来自tick离散(步长22m,云径40m,每云1-2采样点)
2026-06-13 18:11:33 +08:00
fc469aa125
fix: ActiveMaterial阈值对齐InertGas(0.0001); Jet 200km/h避跳步; Piston hp=0.10边际
...
- Jet: 500→200km/h, 步长22m<54m云直径
- ActiveMaterial: TriggerThreshold 0.0002→0.0001
- 149/150 通过, Piston hp=0.10 结构正确
2026-06-13 18:04:31 +08:00
47761e5124
diagnostic: Jet hit_log确认3/6云命中(56m步跳过3个),TimeScale默认改回1
2026-06-13 17:48:47 +08:00
3aac0060e7
test: 修复 MunitionEntity/MultiLane 测试 + Jet/Piston 打印到桌面
...
- 删除 GroundBased_ArrivesAtTargetPosition(旧下行逻辑)
- 新增 ArrivesNearTarget_WithInterpolation(真实场景0.4s步长)
- MultiLane 改断言为 ≥27发+多个Z值
- Jet/Piston 测试结果写入桌面txt
2026-06-13 17:34:15 +08:00
43426ab5fc
fix: MunitionEntity 插值到精确释放高度 + 修正 System.Math 引用
2026-06-13 17:27:06 +08:00
355b430828
fix: 抛物线弹道精确求解 + 上行触发云生成 + 空基修复
...
- Kinematics.CalculateLaunchAngle: 解 tan(θ) 二次方程取平射解
- Kinematics.ParabolicShellTime: 精确飞行时间替代 dist/mv 近似
- MunitionEntity.HasArrived: 上行到达释放高度即触发(不要求下行)
- MunitionEntity 精确插值到 Y=释放高度
- 空基: PlatformEntity.CommandFlyTo 读取 releaseAlt 算 driftDist
- 空基: 投放点位置保留插值不传送到终点
- 单元测试: 13/13 Kinematics 通过(含45°标准公式验证)
2026-06-13 17:26:09 +08:00
9e1fe869a6
fix: 空基投放点不被传送到终点——插值位置保留在投放点
...
- PlatformEntity 投放条件触发时不设置PosX=targetX,保留插值位置
- 空基FireEvent.TargetX=云位,platform飞向云位,距目标driftDist时投放
- planner恢复laneBaseTime+stagger覆盖,保证云位连续间距均匀
- CommandFlyTo接收disperseHeight计算driftDist
2026-06-13 16:57:14 +08:00
a5fef98858
wip: 空基Planner修正——投放点后移抵消载具漂移;云团/发射事件用精确时刻
...
- 空基 GenerateFireEventsAt 投放点后移 driftX = cruiseSpeed * fallTime
- MunitionEntity 记录 launchTime + flightDuration → ArrivalTime 精确计算
- 云团 Initialization 用 munition.ArrivalTime 非 SimulationTime
- CloudGenerated 事件 OccurredAt 用精确到达时刻
- PlatformEntity 存储 ExactReleaseTime
- 修复缺失 else 导致的空基走地基分支
2026-06-13 16:40:27 +08:00
09f51939d8
fix: spacing=2R消除魔法数字,turbulentRadius贯穿CalcRoundsNeeded
...
- ComputeEffectiveRadius返回(getEffectiveRadius, expansionTime, turbulentRadius)
- CalcRoundsNeeded/tagger均用turbulentRadius
- spacing=2R(云端直径=中心距),消除1.5f经验系数
- FireEvent.OccurredAt存储fe.FireTime精确发射时刻
2026-06-13 16:03:01 +08:00
6cd18bf142
fix: FireUnit不拆通道 + PlatformIndex按unitIdx*TotalChannels+ch映射
...
- BuildFireUnits: 一个物理单元 = 一个 FireUnit(TotalChannels = GunCount*ChannelsPerGun)
- _entityCounter 在平台创建前重置为0,platform ID从1开始
- GenerateFireEventsAt 通过 unitIdx*TotalChannels+ch 计算 PlatformIndex
- 移除赋值循环中覆盖 PlatformIndex 的代码
2026-06-13 15:44:35 +08:00
2162a342b7
perf: RunSimulation支持自定义TimeScale + 删除诊断dump + 批量commit
...
- RunSimulation 增加 timeScale 参数(默认8f)
- 删除 fireSchedule 诊断 dump 到桌面
- Commit 批量50帧
2026-06-13 15:20:50 +08:00
197f8b6e5c
perf: Commit批量50帧 + Calc回到+1(11发最优)
...
- _frameDb.Commit() 从每帧改为每50帧批量提交
- CalcRoundsNeeded 回退到 +1(12发反更差)
- Piston: 10机50m间距8/10击毁
2026-06-13 15:17:25 +08:00
070167f572
fix: 编队偏移持久化到航点 + yLanes=Quantity + 云Z展开
...
- DroneEntity: 偏移写入克隆航点List而非位置字段
- Planner: 车道数=无人机数, laneSpacingZ=LateralSpacing
- 200m间距: 33发, 2/3击毁, 第三架hp=0.10边缘效应
2026-06-13 15:03:44 +08:00
b596b4a791
fix: roundInLane+ch 双重错开 + TargetY 分析
...
- stagger = (baseRoundInLane+ch)×CloudCoverInterval
- 引擎 span=7.20s, Planner单元测试 span=7.27s
- 2/3 击毁,第三架 FormationOffsetY 垂向偏移导致覆盖窗口缩短
2026-06-13 14:42:16 +08:00
0c9cdb7b82
fix: stagger=roundInLane*speed 替代 ch*speed——通道展开为1后ch永远为0
...
- roundInLane = singleNeeded - laneNeeded[currentLane]
- 跨度从 0.125s → 7.39s
- Piston: 2/3 击毁
2026-06-13 14:35:29 +08:00
c5c1b79946
fix: ChannelInterval 降到 0.1s——CloudCoverInterval 不再被硬件卡住
...
- Kinetics.CloudCoverInterval minInterval 默认 0.1s
- DefaultFireUnits ChannelInterval 1.0→0.1
- 多机横向编队跨度 10s→7.27s
2026-06-13 14:24:11 +08:00
6a6c03f0fa
fix: 每单元固定Y车道 + CloudCoverInterval物理间隔 + 16通道
...
- Solve: 每单元分配一个Y车道,所有弹打同一高度
- stagger=CloudCoverInterval 替代硬编码 ChannelInterval
- Kinematics.CloudCoverInterval: 云团直径/目标速度,不小于硬件间隔
- DefaultFireUnits: ground-light 改为 16通道
- 报告 F1→F2 精度
- MultiLane_3Drones_3Lanes_ExactOutput 单元测试
2026-06-13 14:18:18 +08:00
4f509e5a2a
refactor: 每单元锁定一个Y车道,非轮转分配
...
- 单元→车道固定分配(管转向跟不上一发一个Y)
- 车道需求 tracked,单元依次填满当前车道
2026-06-13 14:04:00 +08:00
29aa11665b
fix: 多单元并行 + 多车道正确弹药计算
...
- 所有单元以同基准时间并行发射(offset=0)
- 通道内 ch×ChannelInterval 独立错开
- CalcRoundsNeeded 恢复纯单机,yLanes 乘法在 Solve
- Piston: 33发=11×3车道, 2/3击毁
2026-06-13 13:57:56 +08:00
c7792d1d4a
feat: 多机编队Y车道分布 + 8火力单元
...
- GenerateFireEventsAt: 按 yLane×laneSpacingY 分布云团Y坐标
- Piston 测试: 8 ground-light × 3机横向编队
- 42发弹, 2架击毁, Y车道对齐无人机位置
2026-06-13 13:26:43 +08:00
a9339c36e3
feat: 编队2D模型 — LateralSpacing/LongitudinalSpacing + DroneEntity 纵向偏移
...
- RoutePlan: FormationSpacing→LateralSpacing, 新增LateralCount/LongitudinalCount/LongitudinalSpacing
- DroneEntity: 2D编队(latIdx/longIdx), 横向Y展开+纵向X落后
- DefaultFormations: 6种编队模板
- DroneEntityTests: 11个(含2D编队/2×2方队/蜂群)
- Planner: yLanes=ceil(formationWidth/cloudDiam), totalNeeded=single×lanes
2026-06-13 13:20:18 +08:00
4706c4b8c1
feat: 编队模型扩展 — LateralSpacing/LongitudinalSpacing/LateralCount/LongitudinalCount
...
- FormationSpacing → LateralSpacing(正面横向间距)
- 新增 LongitudinalCount/LongitudinalSpacing(纵深串列)
- DefaultFormations: 6种默认编队模板(单机/3机横队/5机横队/3机纵队/2×2方队/10机蜂群)
- Piston 测试设置 LateralCount=3, LongitudinalCount=1
2026-06-13 13:16:27 +08:00
67223cd392
docs: 仿真器实体与事件映射 — 补充空基流程/Planner/状态机
2026-06-13 12:41:51 +08:00
4e157834f7
docs: 总体架构V9 + DefensePlanner V3 同步当前实现
...
- 架构文档: IDefenseAdvisor→IDefensePlanner 全量替换,架构图更新
- DefensePlanner: FireUnit模型补全通道/检测字段,数据流改为引擎内部调用
- 旧接口迁移表标记完成,实现状态分已实现/已删除/不变
2026-06-13 12:40:54 +08:00
76d845f91b
docs: 同步 0.3.0 版本 — VERSION/CHANGELOG/实施计划更新
...
- VERSION: 0.2.0 → 0.3.0
- CHANGELOG: 新增 0.3.0 条目(DefensePlanner/空基/通道模型/fallback清理)
- 实施计划: 更新 8.1.3/8.1.6 为完成,指标同步
2026-06-13 12:37:25 +08:00