refactor: 引擎自治 — 不再需要外部传 SetFireSchedule

- SimulationEngine.Initialize 内建 BuildFireUnits/BuildDroneGroups → 自动调 Planner
- 删除 FullPipelineTests 中的 BuildFireSchedule/_lastFireSchedule/手动 SetFireSchedule
- Unity Managers 删除手动 SetFireSchedule 调用
- 引擎是 Planner 的唯一调用者,测试和 UI 不再碰火控逻辑
This commit is contained in:
tian 2026-06-13 09:58:11 +08:00
parent 77351d8198
commit 50ec14bb24
4 changed files with 3 additions and 24 deletions

View File

@ -100,7 +100,6 @@ namespace CounterDrone.Unity
var runner = gameObject.AddComponent<SimulationRunner>(); var runner = gameObject.AddComponent<SimulationRunner>();
runner.Awake(); runner.Awake();
runner.Engine.SetFireSchedule(plan.MergedSchedule);
runner.LoadAndStart(taskId); runner.LoadAndStart(taskId);
runner.Engine.TimeScale = 10f; runner.Engine.TimeScale = 10f;

View File

@ -118,7 +118,6 @@ namespace CounterDrone.Unity
Runner = GetComponent<SimulationRunner>(); Runner = GetComponent<SimulationRunner>();
if (Runner == null) Runner = gameObject.AddComponent<SimulationRunner>(); if (Runner == null) Runner = gameObject.AddComponent<SimulationRunner>();
else Runner.enabled = true; else Runner.enabled = true;
Runner.Engine.SetFireSchedule(plan.MergedSchedule);
Runner.LoadAndStart(taskId); Runner.LoadAndStart(taskId);
// 设置倍速 // 设置倍速

View File

@ -21,7 +21,6 @@ namespace CounterDrone.Core.Tests
private readonly FrameDataStore _frameStore; private readonly FrameDataStore _frameStore;
private readonly SQLiteConnection _mainDb; private readonly SQLiteConnection _mainDb;
private List<AmmunitionSpec> _ammoCatalog; private List<AmmunitionSpec> _ammoCatalog;
private List<FireEvent> _lastFireSchedule;
private string _taskId = string.Empty; private string _taskId = string.Empty;
public FullPipelineTests() public FullPipelineTests()
@ -52,14 +51,6 @@ namespace CounterDrone.Core.Tests
{ {
var engine = new SimulationEngine(_scenario, _frameStore, new DamageModelRouter(), _paths); var engine = new SimulationEngine(_scenario, _frameStore, new DamageModelRouter(), _paths);
// 如果有推荐方案,生成发射计划
var detail = _scenario.GetTaskDetail(_taskId)!;
if (detail.Equipment.Any(e => e.EquipmentRole == (int)EquipmentRole.LaunchPlatform))
{
var schedule = BuildFireSchedule(detail);
engine.SetFireSchedule(schedule);
}
engine.Initialize(_taskId); engine.Initialize(_taskId);
engine.TimeScale = 8f; // 8倍速加速 engine.TimeScale = 8f; // 8倍速加速
for (int i = 0; i < maxTicks; i++) for (int i = 0; i < maxTicks; i++)
@ -71,13 +62,9 @@ namespace CounterDrone.Core.Tests
return engine; return engine;
} }
/// <summary>从推荐方案的时机参数生成发射计划</summary> private static readonly string ReportOutputDir = Path.Combine(
private List<FireEvent> BuildFireSchedule(TaskFullConfig detail) AppDomain.CurrentDomain.BaseDirectory, "..", "..", "..", "..", "..", "reports");
{
return _lastFireSchedule ?? new List<FireEvent>();
}
/// <summary>创建默认火力单元并调用 Planner 生成方案</summary>
private DefensePlan ApplyDefensePlan(PlatformType? preferredPlatform = null) private DefensePlan ApplyDefensePlan(PlatformType? preferredPlatform = null)
{ {
var detail = _scenario.GetTaskDetail(_taskId)!; var detail = _scenario.GetTaskDetail(_taskId)!;
@ -141,9 +128,7 @@ namespace CounterDrone.Core.Tests
var planner = new DefaultDefensePlanner(_ammoCatalog); var planner = new DefaultDefensePlanner(_ammoCatalog);
var result = planner.Plan(fireUnits, threats, detail.Scene); var result = planner.Plan(fireUnits, threats, detail.Scene);
_lastFireSchedule = result.Best.MergedSchedule; // 写入云团参数
// 写入云团参数(从规划方案派生的简化参数)
if (threats.Count > 0) if (threats.Count > 0)
{ {
var t = threats[0]; var t = threats[0];
@ -156,7 +141,6 @@ namespace CounterDrone.Core.Tests
AerosolType = platType == PlatformType.AirBased ? (int)AerosolType.InertGas : (int)AerosolType.InertGas, AerosolType = platType == PlatformType.AirBased ? (int)AerosolType.InertGas : (int)AerosolType.InertGas,
PositionX = mid.X, PositionY = mid.Y, PositionZ = mid.Z, PositionX = mid.X, PositionY = mid.Y, PositionZ = mid.Z,
DisperseHeight = (float)t.Target.TypicalAltitude, DisperseHeight = (float)t.Target.TypicalAltitude,
RecommendedTiming = _lastFireSchedule.Count > 0 ? _lastFireSchedule[0].FireTime : 0,
Source = "Algorithm", Source = "Algorithm",
PositionMode = (int)PositionMode.AlgorithmRecommended, PositionMode = (int)PositionMode.AlgorithmRecommended,
}); });
@ -165,9 +149,6 @@ namespace CounterDrone.Core.Tests
return result.Best; return result.Best;
} }
private static readonly string ReportOutputDir = Path.Combine(
AppDomain.CurrentDomain.BaseDirectory, "..", "..", "..", "..", "..", "reports");
private void VerifyAndExportReport(SimulationEngine eng, DroneEntity drone) private void VerifyAndExportReport(SimulationEngine eng, DroneEntity drone)
{ {
var detail = _scenario.GetTaskDetail(_taskId)!; var detail = _scenario.GetTaskDetail(_taskId)!;