|
|
ca0ce8aa52
|
重命名核心模型:TargetConfig→DroneProfile, SimTask→Scenario, TaskFullConfig→ScenarioConfig, TaskId→ScenarioId
- DroneType 枚举清理:移除 Electric/Piston,重编号 HighSpeed=2
- planner_config.json / defaults.json 同步迁移
- 238 单元测试全部通过
|
2026-06-18 15:02:58 +08:00 |
|
|
|
def3996f4f
|
更新编译产物:Core.dll 复制到 Unity Plugins
|
2026-06-18 13:43:14 +08:00 |
|
|
|
fb87fdfa22
|
统一平台物理模型:去除空基/地基分支
- BuildCandidate 合并 BuildAirBased/GroundBasedCandidate 为单一方法,统一用 MuzzleVelocity
- TryGenerateFireEvents 统一用 InterceptCalculator.Compute,去除 ComputeHorizontal
- 抛物线选解策略:两解逐一验证可行性(距离匹配 + fireTime>0),选最早拦截的解
- 空基 FireUnit 补充 MuzzleVelocity 字段(等于 CruiseSpeed)
- 所有 238 个单元测试通过
|
2026-06-18 13:40:48 +08:00 |
|
|
|
92d1131dc1
|
fix: 统一选择远点命中 + FlightDuration 传递,喷气式通过
PlanUnitLane: ParabolicMotion.GetFlightTimes 选远点(离无人机近)
FireEvent: 新增 FlightDuration 字段
MunitionEntity: 接收 flightDuration → _useTimeArrival,按时间到达
地基: FlightDuration = interceptShellTime(保持 InterceptCalculator 一致性)
空基: FlightDuration = ParabolicMotion 选出的远点 tof
238 全部通过
|
2026-06-18 10:04:30 +08:00 |
|
|
|
b4f9a4055c
|
build: 同步 DLL 到 Unity Plugins
|
2026-06-18 00:14:44 +08:00 |
|
|
|
4631049aad
|
refactor: 引入 ParabolicMotion 替代自研抛物线方程,修复 c 符号 bug
新增 ParabolicMotion 模块:
- GetFlightTimes(yTarget) 返回所有正时间
- GetFlightTime(yTarget, pref) 按偏好选择
- SolveAngles(range, hd, v0) 返回两个角度
- 支持 TrajectoryPreference {High, Low, Nearest, Farthest}
Kinematics 委托给 ParabolicMotion:
- CalculateLaunchAngle → SolveAngle(Low)
- ComputeParabolicRange → ComputeRange(Nearest)
修复 AI 模块 bug:c = y0 - yTarget → c = yTarget - y0
|
2026-06-18 00:12:45 +08:00 |
|
|
|
5909c86402
|
fix: ManagerVerification waypoint 缺 Speed 字段
|
2026-06-17 23:25:08 +08:00 |
|
|
|
ebebb41671
|
fix: 创建 StreamingAssets 并放入 defaults.json 和 planner_config.json
|
2026-06-17 23:23:29 +08:00 |
|
|
|
eb0cb66196
|
fix: 同步 DLL 到 Unity Assets/Plugins(不是 unity_plugins)
|
2026-06-17 23:22:23 +08:00 |
|
|
|
3d33aac428
|
fix: 强制同步 Core.dll(unity_plugins 在 gitignore 中)
|
2026-06-17 20:24:00 +08:00 |
|
|
|
edea5eaaf0
|
docs: 实施跟踪 V1.7 — Phase 12 + 高弹道待解决问题
|
2026-06-17 20:22:35 +08:00 |
|
|
|
276bb7adfa
|
fix: 空基/地基统一发射角计算,风偏纳入;三机全灭
Kinematics: ComputeParabolicRange 垂直运动直接算时间
DefensePlanner: cloudGen 先算再基于此算角度,消除风偏导致的不一致
DefaultLaneDivider: 宽+深双维度判断拆分
DroneEntity/RoutePlan: 支持 LateralAxis/LongitudinalAxis
MunitionEntity: _arrivesDescending 修正
测试: 237 通过,Jet(Skip:高弹道)
|
2026-06-17 20:20:00 +08:00 |
|
|
|
0b7bf2ab6f
|
feat: 编队轴配置 + LaneDivider 策略 + 数据版本 V3
RoutePlan/FormationTemplate: 新增 LateralAxis/LongitudinalAxis (0=X,1=Y,2=Z)
DroneEntity: 按 axis 展开编队偏移(lat轴→xyzw, long轴→x偏移, vert→y)
DefaultLaneDivider: 宽/深双维度判断,任一超云团半径则拆分
DefensePlanner: PlanUnitLane 读 LateralAxis 决定偏移方向
defaults.json: air-standard EORange 9600→4000, 所有编队加 axis 字段, 版本 2→3
DatabaseManager: 场景版本 2→3
|
2026-06-17 18:52:53 +08:00 |
|
|
|
6b2905b9f8
|
fix: 活塞想定坐标规范化 — 己方0点,无人机在远方6600→0
|
2026-06-17 18:01:22 +08:00 |
|
|
|
005efae27e
|
refactor: 空基/地基统一规划流程 — 碰撞点之后无分支
DefensePlanner:
- 每发目标点独立计算 launchAngle(地基+空基统一用 CalculateLaunchAngle)
- 碰撞点后统一:cloudGen=tx-wx*expansionTime, deliveryTime 唯一分支
- 空基不再固定 θ=0,改用弹道求解 → 每发云团沿航线均匀分布
InterceptCalculator.ComputeHorizontal:
- 自动识别航路方向(±X),不再硬编码 +X
Kinematics:
- ComputeParabolicRange/ParabolicApex 接受负角度(俯射)
预设:
- air-standard EORange: 9600→4000(1.2×探测距离=4800, 无人机4500m≈1.12×)
- 空基坐标:己方0, 平台5000, 无人机9500→0
- 活塞坐标:平台6600 (1.1×探测6000)
删除不适合新规划的单元测试(AirBased 场景测试)
|
2026-06-17 17:59:13 +08:00 |
|
|
|
06038d3e90
|
fix: 每发炮弹独立计算发射角,云团均匀分布;探测门控发射
DefensePlanner:
- PlanUnitLane 中为目标点(tx,ty,tz)重新计算 launchAngle
- 不再复用 InterceptCalculator 的统一角度,每发角度不同
- 活塞想定:平台从 7000→6600(1.1×探测距离)
结果:8发炮弹云团沿航线均匀分布,间距~32m
|
2026-06-17 17:14:37 +08:00 |
|
|
|
24ba621581
|
fix: 发射计划以探测时刻为时间起点 — 引擎等探测后才执行
SimulationEngine:
- _anyThreatDetected 门控:无人机未进入探测范围前不执行发射
- _detectionTime 记录首次探测时刻
- 发射时间 = fe.FireTime(偏移) + _detectionTime
- 删除 AirBased/GroundBased_LaunchesWithCorrectDescription(测试旧行为)
设计:planner 给出的 fireTime 是相对探测时刻的偏移,引擎在探测后应用偏移
|
2026-06-17 16:44:14 +08:00 |
|
|
|
79256d56f4
|
release: 0.9.0 — CHANGELOG + VERSION + 任务跟踪 Phase 11
|
2026-06-17 16:13:05 +08:00 |
|
|
|
0b531de794
|
docs: 同步设计文档 — 空基固定阵位发射、实体属性更新、基础数据 CRUD 架构
|
2026-06-17 16:10:54 +08:00 |
|
|
|
bc8b401ef6
|
docs: 总体架构 V14 — FrameDataStore 内存回放双层存储设计
|
2026-06-17 16:08:58 +08:00 |
|
|
|
6098186f34
|
perf: 回放优先用内存 LiveFrames — 仿真刚结束时避免读数据库
FrameDataStore:
- Flush() 后保留 LiveFrames 副本在内存
- BeginRecording() / Discard() 时清除 LiveFrames
ReplayController:
- LoadReplay(taskId, frameStore) 优先取 LiveFrames
- frameStore 为 null 或 LiveFrames 为空时回退读 SQLite
- SimulationRunner 暴露 FrameStore 供 ReplayController 传入
|
2026-06-17 16:07:24 +08:00 |
|
|
|
4c2c18cfcc
|
docs: 重写对接文档 — 五步完整工作流(基础数据→想定→仿真→报告→回放)
|
2026-06-17 15:57:41 +08:00 |
|
|
|
5d79e26e0f
|
feat: ScenarioManager 接入 DataService — 前端启动前即可管理基础数据
|
2026-06-17 15:54:20 +08:00 |
|
|
|
6f28704368
|
docs: 对接文档 V1.5 — 新增 DataService 基础数据 CRUD 章节
|
2026-06-17 15:50:48 +08:00 |
|
|
|
e782062377
|
feat: Unity 端接入 DataService — 前端可直接 CRUD 基础数据
SimulationRunner 新增 DataService 属性
SimulationBootstrap 自动创建 DataService 并注入 Runner
前端调用: runner.DataService.GetAllDrones() 等
|
2026-06-17 15:50:22 +08:00 |
|
|
|
120f2805ec
|
feat: 基础数据 CRUD — 统一命名,建表入库,DataService 提供全 CRUD
类名规范化:
- FireUnitTemplate → FireUnitSpec(火力单元规格)
- TargetPreset → DroneSpec(无人机规格)
- DetectionPreset → SensorSpec(传感器规格)
- WeatherPreset → EnvironmentSpec(环境规格)
- RoutePreset → RouteTemplate(航线模板)
DefaultData 属性重命名:
- Targets → Drones, DetectionEquipment → Sensors, Weather → Environments
- JSON 兼容: JsonPropertyName 保持原键名
新增: IDataService + DataService — 7 类基础数据全 CRUD
新增: 6 个 Repository(SpecRepositories.cs)
新增: DatabaseManager 自动建表 + 种子数据(RouteTemplate.Waypoints JSON 序列化存储)
测试: 243 通过
|
2026-06-17 12:36:49 +08:00 |
|
|
|
e250093a16
|
docs: 更新对接文档 V1.4,同步实体属性变更
- 事件示例:cloud.Dispersion.Center → cloud.PosX/Y/Z, cloud.Radius
- API 列表:新增 Platforms 访问
- 新增 EntitySnapshot 字段文档(VelX/Y/Z)
- 新增实体属性速查表(所有 5 种实体)
- 测试状态更新:243 测试 9 秒全部通过
- Unity 脚本同步更新
|
2026-06-17 12:20:55 +08:00 |
|
|
|
3bb6e7a091
|
feat: 补全实体属性暴露,让 Unity 前端可直接访问所有运行时数据
引擎层:
- 新增 Platforms 列表 (SimulationEngine.Platforms)
- EntitySnapshot 新增 VelX/VelY/VelZ 速度字段
- CollectSnapshots 收集所有实体类型(含 Munition/Detection)
CloudEntity: Pos/Radius/Density/Phase/Elapsed 便捷属性
MunitionEntity: Start/LaunchTime/ElapsedTime + Velocity 瞬时速度
DroneEntity: TraveledArc/TotalArc/Progress 航程进度
PlatformEntity: Target/FlightDistance/FlownDistance 飞行目标
DetectionEntity: PosX/Y/Z 位置(从 Source.Position)
|
2026-06-17 12:16:37 +08:00 |
|
|
|
ff830c1221
|
fix: 启用并修复 3机空基编队测试
DefaultScenarios:
- Seed3DronesAirBased: 参数对齐单机空基测试(风速5m/s东风、航速200)
- 3个平台沿X轴间隔300m分布(6000/6300/6600)
FullPipelineTests:
- Scenario_3DronesAirBased: 移除Skip,所有无人机被摧毁
- Scenario_DetectionDriven: 移除Skip,测试通过
测试: 243 通过 0 失败
|
2026-06-17 12:06:53 +08:00 |
|
|
|
da4e8d5c63
|
refactor: 移除隐藏 Math.Max 回退,改为显式验证或数值 epsilon
GaussianPuffDispersion:
- BurstChargeKg ≤ 0 → 抛异常,不再用 Math.Max(0.01, ...) 掩护
- Phase3 扩散距离 x ≤ 0 → 跳过,不再用 Math.Max(1f, ...)
- Opacity/SizeMultiplier → 除零改为显式判 0
- 缓存 _initialRadius 避免重复 Pow 计算
CloudExpansionModel:
- BurstChargeKg ≤ 0 → 抛异常
- Phase3 x ≤ 0 → 直接返回 Phase2 末半径
- RoundsNeeded: s ≤ 0 → 返回 1
DefensePlanner:
- yLanes>1 判定已在上一行,去掉冗余 Math.Max(1, ...)
InterceptCalculator:
- 保留 +0.001f epsilon(确保 ts>0),但不作为隐藏回退
- 改用显式加偏移替代 Math.Max(0.001f, ...)
DetectionCalculator.SpreadRadius: accuracy<0 → 抛异常
RouteGeometry: arcLength<0 → 钳位为 0(显式 if)
保留 10 处合法 Math.Max(取两值中较大者或几何钳位)
|
2026-06-17 11:30:56 +08:00 |
|
|
|
7bdda062c0
|
fix: 空基弹药从固定阵位水平发射,修正到达判定和插值
DefensePlanner 空基:
- 移除「飞到投放点再投弹」模型
- 改用固定阵位 + ComputeParabolicRange 前向计算
- ComputeHorizontal 使用 platform.PosY 替代 unit.ReleaseAltitude
- 云团位置 = 炮弹到达位置(飞行方向指向拦截点)
MunitionEntity:
- LaunchAngle/Azimuth/MuzzleVelocity/FlightDuration 改为 public
- 修正下落场景到达判定:发射点高于释放高度时等 Y 下降到位
- 修正插值除零回退 Math.Max(0.01f, ...) 导致负分母炸裂
SimulationEngine:
- 删除空基「到达投放点」死代码
- 删除 InterceptCalculatorAirTests 打印测试
测试: 241 通过 0 失败
|
2026-06-17 11:23:02 +08:00 |
|
|
|
e1f576fbe5
|
chore: 移除临时文件 t.txt
|
2026-06-17 10:46:13 +08:00 |
|
|
|
0ed714a730
|
refactor: 抛物线运动学前向计算 — 移除回退/反算,统一用 ParabolicPosition
Kinematics:
- CalculateLaunchAngle/ParabolicTimeOfFlight/ParabolicShellTime: 移除静默钳位和 45° 回退,输入无效直接抛异常
- 新增 ComputeParabolicRange(v₀,θ,Δy) → (射程,飞行时间) — 正问题
- 新增 ParabolicApex(v₀,θ) → (顶点高度,顶点时间)
- ParabolicShellTime 改为委托,不重复实现
MunitionEntity:
- launchAngle 必须由方案提供,不再反算
- _flightDuration 用 ComputeParabolicRange 正算
- 删除死代码 CommandFlyTo / 「到达投放点」路径
DefensePlanner:
- 地基用 InterceptCalculator 的 shellTime,不再用 ParabolicShellTime 反算
SimulationEngine:
- 删除空基「到达投放点」死代码
Tests: 240 通过 (KinematicsTests 38, DefensePlannerTests 36, SimulationEngineTests 12, MunitionEntityTests 3)
|
2026-06-17 10:45:56 +08:00 |
|
|
|
72e465570f
|
fix: IC 的 crossArc 加 per-round targetOffset;空基 IC 集成(candidate + TryGenerateFireEvents)
|
2026-06-17 08:46:45 +08:00 |
|
|
|
69e41e3f7c
|
feat: Planner→FireEvent 传递发射角; MunitionEntity 使用 planner 提供的角度(不再重算)
|
2026-06-17 08:20:54 +08:00 |
|
|
|
3fd8433276
|
feat: InterceptCalculator 返回发射角; FireEvent +LaunchAngle 字段; 重新集成到 planner
|
2026-06-17 08:13:20 +08:00 |
|
|
|
663afbe639
|
build: 更新 Unity Plugins Core.dll (v0.8.0)
|
2026-06-16 17:46:46 +08:00 |
|
|
|
ae47899080
|
docs: 更新想定参数表、任务跟踪、实体事件映射至 Phase 10 完成状态
|
2026-06-16 17:33:23 +08:00 |
|
|
|
df8e18d2d0
|
chore: 版本升至 0.8.0,更新 CHANGELOG
|
2026-06-16 17:31:09 +08:00 |
|
|
|
c2a10c1d51
|
chore: 清理调试代码,数据版本升至 V2
|
2026-06-16 17:28:36 +08:00 |
|
|
|
8e73c9b2ec
|
feat: InterceptCalculator.ComputeHorizontal — 空基平抛(θ=0°)拦截点求解;全部231测试通过
|
2026-06-16 17:25:06 +08:00 |
|
|
|
016d9ac24b
|
feat: InterceptCalculator 集成到 planner,替换硬编码中点逻辑;PlannerConfig +ReactionTime;Jet 通过
|
2026-06-16 16:24:08 +08:00 |
|
|
|
2089ff6c7b
|
feat: InterceptCalculator — 抛物线与直线联立方程求解拦截点
|
2026-06-16 16:12:31 +08:00 |
|
|
|
e0b80a39de
|
docs: 默认想定参数对照表(探测范围/部署位置/航路对比)
|
2026-06-16 14:14:55 +08:00 |
|
|
|
d8470bad30
|
Phase 10: 探测实时链路开发 + planner 诊断 + 硬编码消除
- 3D球冠探测: IsInCoverage, DetectionEntity, Tick 第5步扫描
- 探测融合: EarliestDetection 采样法, break 修复
- planner 诊断: HasInterceptWindow 拦截窗口检查
- TryGenerateFireEvents 返回拒绝原因
- Summary 含失败原因+建议值(探测范围/弧长)
- PlanningFailed 事件: 引擎在规划失败时发出事件
- 硬编码消除: Phase2Duration→AmmunitionSpec
ExpansionFactor/TimingSafetyMargin→PlannerConfig
速度从 waypoint.Speed 读取(不用 TypicalSpeed)
- TestData 改为从 seeded 数据库读取(不再内嵌 JSON)
- 默认数据加 3D球冠参数,巡航导弹速度300→200
空基航路10km→20km, 位置调整
- 222 测试全通过
|
2026-06-16 14:10:23 +08:00 |
|
|
|
6b005cf9cc
|
docs: 跟踪文档更新至 V1.5 + 探测统一原则定性纠正
1. 实施计划与任务跟踪 V1.4 -> V1.5:
- 阶段总览补 Phase 9(完成)/Phase 10(待开发)
- 校准现状:7.1 性能优化 ✅(<20->200+ FPS)、8.1.1 探测设计完成
- 测试数 191 -> 204,执行时间 41s -> 7s
- Phase 8 标题去掉误导性 ✅,未完成项(蜂群/PDF/Word/第三方)补 ⬜
- 新增 Phase 9:性能优化 5 项 + 文档校准 3 项(均 ✅)
- 新增 Phase 10:探测实时链路任务拆解(T1-T5, 依赖图, 总预估 11h)
- 里程碑补 M8/M9/M10
2. 探测统一原则定性纠正(总体架构设计 14.2/14.2.1/14.7):
- 原表述"统一原则"被弱化为"好看的对称",且有"planner 可保留 2D"备选方案
- 纠正:仿真是按 planner 规划执行的,planner 探测判定 = 仿真事实依据
- planner 若用 2D 判定"能发现"但目标高度超出 3D 球冠范围,会导致
"未探测却拦截并摧毁"的物理错误结局
- 统一原则是正确性硬约束,T3 不可砍、不可降级为 2D
- 澄清两个独立问题:采样误差(<=1.5s)不影响火力计划(正确);
2D->3D 几何升级不可省略(我之前漏了)
|
2026-06-16 11:27:13 +08:00 |
|
|
|
68b7434ddc
|
docs: 总体架构设计校准与探测设备设计补全(V10→V13)
文档与代码对齐 + 探测设备行为设计固化。
1. 文档校准(修正与实现不符的错误):
- AlgorithmFactory 实际为 Func<object> 工厂委托(非 Type+Activator)
- IDefensePlanner.Plan 为 4 参数(含 detectionSources)
- IDamageModel 补 RequiredExposureSeconds
- FrameDataStore 是类非 IFrameDataStore 接口;删除不存在的 IRecordService
- DroneEntity 运动模型为弧长驱动(不受风偏);Tick 流程顺序对齐
- StateData 改为强类型字段+入库时序列化的双轨说明
2. 新增第十三章 性能设计(Tick 热路径优化,实测 <20 到 200+ FPS):
- 航路几何缓存、仿真期零字符串分配、多边形顶点缓存
- 帧数据内存缓存+批量落库、毁伤快速排斥、移除索引复用
3. 新增第十四章 探测设备设计(统一信息网络):
- 区分事前静态规划(已实现)与运行时实时探测(待实现)双链路
- 三维球冠探测几何(俯仰角+高度门限,IsInCoverage)
- 5 项行为决策确认:回退 Undetected / 融合取最早-同刻取精度高 /
不影响 FireSchedule / 盲区仅可视化 / 支持 3D 球冠
- EquipmentDeployment 加 4 个 3D 探测字段 + 数据模型变更清单
4. 附带:技术要求终版.txt 错别字修正(晕图案 改 云团)
|
2026-06-16 10:59:32 +08:00 |
|
|
|
ce9d44db7e
|
perf: 仿真期间零字符串分配,JSON 序列化推迟到 Flush
EntitySnapshot 新增原始字段(DamageStage/Hp/CloudRadius等), CollectSnapshots 直接填值
FrameDataStore buffer 改为 FrameRecord 结构体, Flush 时统一拼 JSON
SimulationRunner 直接读 snap.CloudRadius/CloudOpacity, 移除 JsonDocument.Parse
删除 SimulationEngine 的 StringBuilder 和 Str() 方法
|
2026-06-15 19:18:44 +08:00 |
|
|
|
fb22605fa3
|
perf: CollectSnapshots 改用 StringBuilder 池化避免中间字符串分配
StringBuilder.AppendFormat 复用内部缓冲区,每实体从4次分配到1次
.NET Standard 2.1 不支持 Span<T> 作泛型参数,string.Create 方案不可行
|
2026-06-15 19:14:17 +08:00 |
|
|
|
b3dec77e92
|
fix: DispersionModelTests 共享状态污染导致随机失败
Dissipates_AfterMaxDuration 直接用 Ammo() 返回的共享引用并修改 MaxDuration=2,后续 Phase2/Phase3 测试拿到被污染的数据
改为独立 new AmmunitionSpec 避免修改共享对象
|
2026-06-15 19:11:44 +08:00 |
|