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

View File

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

View File

@ -374,7 +374,7 @@
31004210 31004210
], ],
"ModifyValues": [ "ModifyValues": [
0.36 0.17
] ]
}, },
{ {
@ -383,7 +383,7 @@
31004810 31004810
], ],
"ModifyValues": [ "ModifyValues": [
0.88 0.4
] ]
}, },
{ {
@ -392,7 +392,7 @@
31005010 31005010
], ],
"ModifyValues": [ "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: