【PVP调试器】增加PVP调试器

main
刘涛 2026-06-25 19:15:26 +08:00
parent 378bd63c3f
commit f2b7e41b55
13 changed files with 1552 additions and 65 deletions

View File

@ -13,349 +13,349 @@
},
{
"Level": 3,
"Exp": 190,
"Exp": 200,
"MaxEnergy": 210,
"RewardEnergy": 60
},
{
"Level": 4,
"Exp": 280,
"Exp": 290,
"MaxEnergy": 215,
"RewardEnergy": 60
},
{
"Level": 5,
"Exp": 370,
"Exp": 390,
"MaxEnergy": 220,
"RewardEnergy": 60
},
{
"Level": 6,
"Exp": 460,
"Exp": 480,
"MaxEnergy": 225,
"RewardEnergy": 60
},
{
"Level": 7,
"Exp": 550,
"Exp": 580,
"MaxEnergy": 230,
"RewardEnergy": 60
},
{
"Level": 8,
"Exp": 640,
"Exp": 670,
"MaxEnergy": 235,
"RewardEnergy": 60
},
{
"Level": 9,
"Exp": 730,
"Exp": 770,
"MaxEnergy": 240,
"RewardEnergy": 60
},
{
"Level": 10,
"Exp": 820,
"Exp": 860,
"MaxEnergy": 245,
"RewardEnergy": 60
},
{
"Level": 11,
"Exp": 920,
"Exp": 960,
"MaxEnergy": 250,
"RewardEnergy": 60
},
{
"Level": 12,
"Exp": 1010,
"Exp": 1050,
"MaxEnergy": 255,
"RewardEnergy": 60
},
{
"Level": 13,
"Exp": 1160,
"Exp": 1210,
"MaxEnergy": 260,
"RewardEnergy": 60
},
{
"Level": 14,
"Exp": 1290,
"Exp": 1340,
"MaxEnergy": 265,
"RewardEnergy": 60
},
{
"Level": 15,
"Exp": 1410,
"Exp": 1480,
"MaxEnergy": 270,
"RewardEnergy": 60
},
{
"Level": 16,
"Exp": 1540,
"Exp": 1610,
"MaxEnergy": 275,
"RewardEnergy": 60
},
{
"Level": 17,
"Exp": 1670,
"Exp": 1740,
"MaxEnergy": 280,
"RewardEnergy": 60
},
{
"Level": 18,
"Exp": 1800,
"Exp": 1880,
"MaxEnergy": 285,
"RewardEnergy": 60
},
{
"Level": 19,
"Exp": 1920,
"Exp": 2010,
"MaxEnergy": 290,
"RewardEnergy": 60
},
{
"Level": 20,
"Exp": 2050,
"Exp": 2140,
"MaxEnergy": 295,
"RewardEnergy": 60
},
{
"Level": 21,
"Exp": 2180,
"Exp": 2280,
"MaxEnergy": 300,
"RewardEnergy": 60
},
{
"Level": 22,
"Exp": 2310,
"Exp": 2410,
"MaxEnergy": 305,
"RewardEnergy": 60
},
{
"Level": 23,
"Exp": 2460,
"Exp": 2570,
"MaxEnergy": 310,
"RewardEnergy": 60
},
{
"Level": 24,
"Exp": 2610,
"Exp": 2730,
"MaxEnergy": 315,
"RewardEnergy": 60
},
{
"Level": 25,
"Exp": 2760,
"Exp": 2890,
"MaxEnergy": 320,
"RewardEnergy": 60
},
{
"Level": 26,
"Exp": 2920,
"Exp": 3050,
"MaxEnergy": 325,
"RewardEnergy": 60
},
{
"Level": 27,
"Exp": 3070,
"Exp": 3210,
"MaxEnergy": 330,
"RewardEnergy": 60
},
{
"Level": 28,
"Exp": 3220,
"Exp": 3370,
"MaxEnergy": 335,
"RewardEnergy": 60
},
{
"Level": 29,
"Exp": 3370,
"Exp": 3530,
"MaxEnergy": 340,
"RewardEnergy": 60
},
{
"Level": 30,
"Exp": 3530,
"Exp": 3690,
"MaxEnergy": 345,
"RewardEnergy": 60
},
{
"Level": 31,
"Exp": 3680,
"Exp": 3850,
"MaxEnergy": 350,
"RewardEnergy": 60
},
{
"Level": 32,
"Exp": 3830,
"Exp": 4010,
"MaxEnergy": 355,
"RewardEnergy": 60
},
{
"Level": 33,
"Exp": 5050,
"Exp": 5280,
"MaxEnergy": 360,
"RewardEnergy": 60
},
{
"Level": 34,
"Exp": 6260,
"Exp": 6550,
"MaxEnergy": 365,
"RewardEnergy": 60
},
{
"Level": 35,
"Exp": 7480,
"Exp": 7820,
"MaxEnergy": 370,
"RewardEnergy": 60
},
{
"Level": 36,
"Exp": 8690,
"Exp": 9090,
"MaxEnergy": 375,
"RewardEnergy": 60
},
{
"Level": 37,
"Exp": 9910,
"Exp": 10360,
"MaxEnergy": 380,
"RewardEnergy": 60
},
{
"Level": 38,
"Exp": 11120,
"Exp": 11630,
"MaxEnergy": 385,
"RewardEnergy": 60
},
{
"Level": 39,
"Exp": 12340,
"Exp": 12900,
"MaxEnergy": 390,
"RewardEnergy": 60
},
{
"Level": 40,
"Exp": 13550,
"Exp": 14170,
"MaxEnergy": 395,
"RewardEnergy": 60
},
{
"Level": 41,
"Exp": 14770,
"Exp": 15440,
"MaxEnergy": 400,
"RewardEnergy": 60
},
{
"Level": 42,
"Exp": 15980,
"Exp": 16710,
"MaxEnergy": 405,
"RewardEnergy": 60
},
{
"Level": 43,
"Exp": 17850,
"Exp": 18670,
"MaxEnergy": 410,
"RewardEnergy": 60
},
{
"Level": 44,
"Exp": 19720,
"Exp": 20620,
"MaxEnergy": 415,
"RewardEnergy": 60
},
{
"Level": 45,
"Exp": 21600,
"Exp": 22580,
"MaxEnergy": 420,
"RewardEnergy": 60
},
{
"Level": 46,
"Exp": 23470,
"Exp": 24540,
"MaxEnergy": 425,
"RewardEnergy": 60
},
{
"Level": 47,
"Exp": 25340,
"Exp": 26490,
"MaxEnergy": 430,
"RewardEnergy": 60
},
{
"Level": 48,
"Exp": 27210,
"Exp": 28450,
"MaxEnergy": 435,
"RewardEnergy": 60
},
{
"Level": 49,
"Exp": 29090,
"Exp": 30410,
"MaxEnergy": 440,
"RewardEnergy": 60
},
{
"Level": 50,
"Exp": 30960,
"Exp": 32370,
"MaxEnergy": 445,
"RewardEnergy": 60
},
{
"Level": 51,
"Exp": 32830,
"Exp": 34320,
"MaxEnergy": 450,
"RewardEnergy": 60
},
{
"Level": 52,
"Exp": 34700,
"Exp": 36280,
"MaxEnergy": 455,
"RewardEnergy": 60
},
{
"Level": 53,
"Exp": 37310,
"Exp": 39010,
"MaxEnergy": 460,
"RewardEnergy": 60
},
{
"Level": 54,
"Exp": 39910,
"Exp": 41730,
"MaxEnergy": 465,
"RewardEnergy": 60
},
{
"Level": 55,
"Exp": 42520,
"Exp": 44450,
"MaxEnergy": 470,
"RewardEnergy": 60
},
{
"Level": 56,
"Exp": 45120,
"Exp": 47180,
"MaxEnergy": 475,
"RewardEnergy": 60
},
{
"Level": 57,
"Exp": 47730,
"Exp": 49900,
"MaxEnergy": 480,
"RewardEnergy": 60
},
{
"Level": 58,
"Exp": 50330,
"Exp": 52630,
"MaxEnergy": 485,
"RewardEnergy": 60
},
{
"Level": 59,
"Exp": 52940,
"Exp": 55350,
"MaxEnergy": 490,
"RewardEnergy": 60
},
{
"Level": 60,
"Exp": 55550,
"Exp": 58070,
"MaxEnergy": 500,
"RewardEnergy": 60
}

View File

@ -2,19 +2,19 @@
{
"Count": 1,
"PurchaseItem": 2,
"Price": 25,
"Price": 20,
"EnergyPointGet": 50
},
{
"Count": 2,
"PurchaseItem": 2,
"Price": 50,
"Price": 40,
"EnergyPointGet": 50
},
{
"Count": 3,
"PurchaseItem": 2,
"Price": 75,
"Price": 60,
"EnergyPointGet": 50
},
{
@ -26,7 +26,7 @@
{
"Count": 5,
"PurchaseItem": 2,
"Price": 200,
"Price": 150,
"EnergyPointGet": 50
}
]

View File

@ -374,7 +374,7 @@
31004210
],
"ModifyValues": [
0.36
0.17
]
},
{
@ -383,7 +383,7 @@
31004810
],
"ModifyValues": [
0.88
0.4
]
},
{
@ -392,7 +392,7 @@
31005010
],
"ModifyValues": [
4.26
1.94
]
},
{

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 2983065e15c107d4f9b135ebd17d3e64
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,17 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fa6956f019c2a454bb9328b313dae5c2, type: 3}
m_Name: PVPDebugBattlePreset 1
m_EditorClassIdentifier:
levelIdOverride: 0
selfUnits: []
enemyUnits: []

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: fa39f03b82cd3104ebe1433877d004b5
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,29 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fa6956f019c2a454bb9328b313dae5c2, type: 3}
m_Name: PVPDebugBattlePreset
m_EditorClassIdentifier:
levelIdOverride: 0
selfUnits:
- unitType: 0
unitID: 0
cellIndex: 0
level: 1
breakLevel: 0
awakeLevel: 0
skillLevel0: 1
skillLevel1: 1
skillLevel2: 1
skinId: 1
vehicleComponents:
paintSet:
enemyUnits: []

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4a584d2b14d3d134da3763e50f7f976a
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ced9cd9c8bdc2f54e93ea219ffd2589e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6677c6aebaf2c8e45bdc3aec90d9e3e2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,139 @@
using NUnit.Framework;
using Framework.Wrapper;
using NLD.Editor.PVPDebugBattle;
public class PVPDebugBattlePresetTests
{
[Test]
public void Validate_ReturnsError_WhenSelfTeamIsEmpty()
{
var preset = CreatePreset();
preset.selfUnits.Clear();
var valid = PVPDebugBattleValidator.Validate(preset, false, out var error);
Assert.IsFalse(valid);
StringAssert.Contains("己方阵容为空", error);
}
[Test]
public void Validate_ReturnsError_WhenCellIndexIsInvalid()
{
var preset = CreatePreset();
preset.enemyUnits[0].cellIndex = -1;
var valid = PVPDebugBattleValidator.Validate(preset, false, out var error);
Assert.IsFalse(valid);
StringAssert.Contains("敌方第1个单位 cellIndex 无效", error);
}
[Test]
public void Validate_ReturnsError_WhenSameSideCellIndexIsDuplicated()
{
var preset = CreatePreset();
preset.selfUnits.Add(new PVPDebugBattleUnit
{
unitType = Unit.UnitType.Charactor,
unitID = 1002,
cellIndex = preset.selfUnits[0].cellIndex
});
var valid = PVPDebugBattleValidator.Validate(preset, false, out var error);
Assert.IsFalse(valid);
StringAssert.Contains("己方 cellIndex 重复", error);
}
[Test]
public void Validate_ReturnsTrue_ForMinimalValidPreset()
{
var preset = CreatePreset();
var valid = PVPDebugBattleValidator.Validate(preset, false, out var error);
Assert.IsTrue(valid);
Assert.IsEmpty(error);
}
[Test]
public void CreateCharacter_SetsCharacterTypeAndUnitId()
{
var unit = PVPDebugBattleUnit.CreateCharacter(1001);
Assert.AreEqual(Unit.UnitType.Charactor, unit.unitType);
Assert.AreEqual(1001, unit.unitID);
Assert.AreEqual(1, unit.level);
Assert.AreEqual(1, unit.skillLevel0);
Assert.AreEqual(1, unit.skillLevel1);
Assert.AreEqual(1, unit.skillLevel2);
}
[Test]
public void CreateVehicle_SetsVehicleTypeAndUnitId()
{
var unit = PVPDebugBattleUnit.CreateVehicle(2001);
Assert.AreEqual(Unit.UnitType.Vehicle, unit.unitType);
Assert.AreEqual(2001, unit.unitID);
Assert.IsNotNull(unit.vehicleComponents);
Assert.IsNotNull(unit.paintSet);
}
[Test]
public void GetUsedCells_ExcludesCurrentUnit()
{
var units = new System.Collections.Generic.List<PVPDebugBattleUnit>
{
new PVPDebugBattleUnit { cellIndex = 5 },
new PVPDebugBattleUnit { cellIndex = 9 },
new PVPDebugBattleUnit { cellIndex = 12 }
};
var usedCells = PVPDebugBattleCellPickerUtility.GetUsedCells(units, 1);
CollectionAssert.Contains(usedCells, 5);
CollectionAssert.Contains(usedCells, 12);
CollectionAssert.DoesNotContain(usedCells, 9);
}
[Test]
public void GetFlatTopHexCenter_OffsetsOddColumns()
{
var first = PVPDebugBattleCellPickerUtility.GetFlatTopHexCenter(0, 0, 40f, 34f);
var second = PVPDebugBattleCellPickerUtility.GetFlatTopHexCenter(0, 1, 40f, 34f);
Assert.AreEqual(20f, first.x);
Assert.AreEqual(17f, first.y);
Assert.AreEqual(50f, second.x);
Assert.AreEqual(34f, second.y);
}
[Test]
public void ResolveMoveGuid_DoesNotFallbackToConfigUnitId()
{
const uint configUnitId = 100001;
const uint runtimeGuid = 1234567;
Assert.AreEqual(runtimeGuid, PVPDebugBattleContext.ResolveMoveGuid(configUnitId, runtimeGuid));
Assert.AreEqual(0, PVPDebugBattleContext.ResolveMoveGuid(configUnitId, 0));
}
private static PVPDebugBattlePreset CreatePreset()
{
var preset = UnityEngine.ScriptableObject.CreateInstance<PVPDebugBattlePreset>();
preset.selfUnits.Add(new PVPDebugBattleUnit
{
unitType = Unit.UnitType.Charactor,
unitID = 1001,
cellIndex = 1
});
preset.enemyUnits.Add(new PVPDebugBattleUnit
{
unitType = Unit.UnitType.Charactor,
unitID = 2001,
cellIndex = 2
});
return preset;
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ff534fc7aa071774dab3a66a7c74e9c6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: