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(