From 2d14c17d9ce6a14160a164a80d5be65caa6e7214 Mon Sep 17 00:00:00 2001
From: tian <11429339@qq.com>
Date: Fri, 12 Jun 2026 11:17:59 +0800
Subject: [PATCH] =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=BC=B9=E8=8D=AF=E6=94=B9?=
=?UTF-8?q?=E4=B8=BAJSON=E6=96=87=E4=BB=B6=E5=AF=BC=E5=85=A5=20+=20Databas?=
=?UTF-8?q?eManager=E7=A7=8D=E5=AD=90=E6=95=B0=E6=8D=AE=20+=20=E6=B5=8B?=
=?UTF-8?q?=E8=AF=95=E6=89=8B=E5=8A=A8=E6=8F=92=E5=85=A5,=20129=E6=B5=8B?=
=?UTF-8?q?=E8=AF=95=E9=80=9A=E8=BF=87?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
data/default_ammo.json | 56 +++++++++++++++++++
src/CounterDrone.Core/DatabaseManager.cs | 18 +++++-
.../Simulation/SimulationEngine.cs | 2 +-
.../Scripts/Managers/ManagerVerification.cs | 6 --
.../Scripts/Managers/SimulationBootstrap.cs | 9 +--
.../FullPipelineTests.cs | 3 -
6 files changed, 75 insertions(+), 19 deletions(-)
create mode 100644 data/default_ammo.json
diff --git a/data/default_ammo.json b/data/default_ammo.json
new file mode 100644
index 0000000..7233f13
--- /dev/null
+++ b/data/default_ammo.json
@@ -0,0 +1,56 @@
+[
+ {
+ "Id": "default-inert",
+ "AerosolType": 0,
+ "Name": "惰性气体弹(发烟罐型)",
+ "InitialRadius": 3.8,
+ "InitialVolume": 14000.0,
+ "CoreDensity": 1.5,
+ "EdgeDensity": 0.1,
+ "InitialTemperature": 1800.0,
+ "BuoyancyFactor": 0.3,
+ "EffectiveConcentration": 0.0001,
+ "MaxRadius": 100.0,
+ "MaxDuration": 120.0,
+ "SourceStrength": 10.0,
+ "BurstChargeKg": 1.5,
+ "TurbulentExpansionK": 3.0,
+ "ParticlesJson": "{}"
+ },
+ {
+ "Id": "default-active",
+ "AerosolType": 1,
+ "Name": "活性材料弹(爆炸分散型)",
+ "InitialRadius": 5.0,
+ "InitialVolume": 30000.0,
+ "CoreDensity": 2.0,
+ "EdgeDensity": 0.2,
+ "InitialTemperature": 2400.0,
+ "BuoyancyFactor": 0.6,
+ "EffectiveConcentration": 0.0002,
+ "MaxRadius": 80.0,
+ "MaxDuration": 90.0,
+ "SourceStrength": 12.0,
+ "BurstChargeKg": 4.0,
+ "TurbulentExpansionK": 4.0,
+ "ParticlesJson": "{}"
+ },
+ {
+ "Id": "default-fuel",
+ "AerosolType": 2,
+ "Name": "活性燃料弹(抛射分散型)",
+ "InitialRadius": 3.8,
+ "InitialVolume": 14000.0,
+ "CoreDensity": 1.8,
+ "EdgeDensity": 0.15,
+ "InitialTemperature": 1900.0,
+ "BuoyancyFactor": 0.4,
+ "EffectiveConcentration": 0.0001,
+ "MaxRadius": 90.0,
+ "MaxDuration": 100.0,
+ "SourceStrength": 10.0,
+ "BurstChargeKg": 1.5,
+ "TurbulentExpansionK": 3.0,
+ "ParticlesJson": "{}"
+ }
+]
diff --git a/src/CounterDrone.Core/DatabaseManager.cs b/src/CounterDrone.Core/DatabaseManager.cs
index e9bc076..d277d9a 100644
--- a/src/CounterDrone.Core/DatabaseManager.cs
+++ b/src/CounterDrone.Core/DatabaseManager.cs
@@ -1,4 +1,7 @@
+using System.Collections.Generic;
using System.IO;
+using System.Linq;
+using System.Text.Json;
using CounterDrone.Core.Models;
using SQLite;
@@ -14,12 +17,13 @@ namespace CounterDrone.Core
_paths = paths;
}
- /// 初始化主数据库(建表)
+ /// 初始化主数据库(建表 + 种子数据)
public SQLiteConnection OpenMainDb()
{
var dbPath = _paths.GetMainDbPath();
var db = new SQLiteConnection(dbPath);
CreateMainTables(db);
+ SeedDefaultData(db);
return db;
}
@@ -41,6 +45,18 @@ namespace CounterDrone.Core
File.Delete(dbPath);
}
+ private void SeedDefaultData(SQLiteConnection db)
+ {
+ if (db.Table().Count() > 0) return;
+
+ var jsonPath = Path.Combine(_paths.GetDataRoot(), "default_ammo.json");
+ if (!File.Exists(jsonPath)) return;
+
+ var specs = JsonSerializer.Deserialize>(File.ReadAllText(jsonPath));
+ if (specs != null)
+ foreach (var s in specs) db.Insert(s);
+ }
+
private void CreateMainTables(SQLiteConnection db)
{
db.CreateTable();
diff --git a/src/CounterDrone.Core/Simulation/SimulationEngine.cs b/src/CounterDrone.Core/Simulation/SimulationEngine.cs
index c1c316f..d6d19ab 100644
--- a/src/CounterDrone.Core/Simulation/SimulationEngine.cs
+++ b/src/CounterDrone.Core/Simulation/SimulationEngine.cs
@@ -41,7 +41,7 @@ namespace CounterDrone.Core.Simulation
private List _zones = new();
private CombatScene _scene = new();
- private float _disperseHeight = 300f;
+ private float _disperseHeight;
private AmmunitionSpec _ammoSpec = new();
private int _tickRate = 20;
diff --git a/src/Unity/Assets/Scripts/Managers/ManagerVerification.cs b/src/Unity/Assets/Scripts/Managers/ManagerVerification.cs
index 6aec82d..c93342d 100644
--- a/src/Unity/Assets/Scripts/Managers/ManagerVerification.cs
+++ b/src/Unity/Assets/Scripts/Managers/ManagerVerification.cs
@@ -46,12 +46,6 @@ namespace CounterDrone.Unity
Debug.Log("3. Scenario configured");
var db = new DatabaseManager(paths).OpenMainDb();
- db.Insert(new AmmunitionSpec
- {
- AerosolType = (int)AerosolType.InertGas, InitialRadius = 50,
- CoreDensity = 1.0, SourceStrength = 50.0, DispersionRateBase = 3.0, MaxRadius = 500,
- MaxDuration = 120, EffectiveConcentration = 0.05,
- });
var ammoCatalog = db.Table().ToList();
var detail = scenarioMgr.GetDetail(taskId);
diff --git a/src/Unity/Assets/Scripts/Managers/SimulationBootstrap.cs b/src/Unity/Assets/Scripts/Managers/SimulationBootstrap.cs
index f3c3032..8e32ab0 100644
--- a/src/Unity/Assets/Scripts/Managers/SimulationBootstrap.cs
+++ b/src/Unity/Assets/Scripts/Managers/SimulationBootstrap.cs
@@ -32,14 +32,7 @@ namespace CounterDrone.Unity
var dbm = new DatabaseManager(paths);
var db = dbm.OpenMainDb();
-
- // 弹药规格
- db.Insert(new AmmunitionSpec
- {
- AerosolType = (int)AerosolType.InertGas, Name = "惰性气体弹",
- InitialRadius = 50, CoreDensity = 1.0, SourceStrength = 50.0, DispersionRateBase = 3.0,
- MaxRadius = 500, MaxDuration = 120, EffectiveConcentration = 0.05,
- });
+ foreach (var a in DefaultAmmunition.GetAll()) db.Insert(a);
// 创建想定
var scenario = new ScenarioService(
diff --git a/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs b/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs
index 914de85..fdbad1e 100644
--- a/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs
+++ b/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs
@@ -29,10 +29,7 @@ namespace CounterDrone.Core.Tests
_paths = new TestPathProvider(_testDir);
var dbm = new DatabaseManager(_paths);
_mainDb = dbm.OpenMainDb();
-
- // 使用默认弹药规格
foreach (var a in DefaultAmmunition.GetAll()) _mainDb.Insert(a);
-
_ammoCatalog = new List(DefaultAmmunition.GetAll());
_scenario = new ScenarioService(