From 939518efcc0c52323587daa1e42fb8bc8774d7f4 Mon Sep 17 00:00:00 2001 From: wuwenbo Date: Mon, 22 Sep 2025 16:18:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E9=80=80=E6=94=BB=E5=87=BB=E6=94=B9?= =?UTF-8?q?=E7=9E=AC=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scripts/TH1_Logic/Unit/IUnitLogic.cs | 2 +- .../Scripts/TH1_Logic/Unit/UnitLogic.cs | 85 +++++++++++++++---- 2 files changed, 69 insertions(+), 18 deletions(-) diff --git a/Unity/Assets/Scripts/TH1_Logic/Unit/IUnitLogic.cs b/Unity/Assets/Scripts/TH1_Logic/Unit/IUnitLogic.cs index 84b9aac9a..16050f543 100644 --- a/Unity/Assets/Scripts/TH1_Logic/Unit/IUnitLogic.cs +++ b/Unity/Assets/Scripts/TH1_Logic/Unit/IUnitLogic.cs @@ -14,7 +14,7 @@ namespace Logic { bool MoveTo(MapData mapData, UnitData unitData, GridData gridData, MoveType moveType); //unit[uid]移动到grid[pos] - void Attack(MapData mapData, UnitData unitDataA, UnitData unitDataB, out float duration, bool isMoment=false); + bool Attack(MapData mapData, UnitData unitDataA, UnitData unitDataB, out float duration, bool isMoment=false); //unit[A]攻击unit[B] void Upgrade(MapData mapData, UnitData unitData); //unit[uid]升级 diff --git a/Unity/Assets/Scripts/TH1_Logic/Unit/UnitLogic.cs b/Unity/Assets/Scripts/TH1_Logic/Unit/UnitLogic.cs index 9b4969dd7..99573da4c 100644 --- a/Unity/Assets/Scripts/TH1_Logic/Unit/UnitLogic.cs +++ b/Unity/Assets/Scripts/TH1_Logic/Unit/UnitLogic.cs @@ -252,16 +252,16 @@ namespace Logic return false; } - public void Attack(MapData mapData, UnitData unit1, UnitData unit2, out float duration, bool isMoment=false) + public bool Attack(MapData mapData, UnitData unit1, UnitData unit2, out float duration, bool isMoment=false) { duration = 0; - if (!mapData.GetPlayerDataByUnitId(unit1.Id, out var player1)) return; - if (!mapData.GetPlayerDataByUnitId(unit2.Id, out var player2)) return; - if (!mapData.GetCityDataByUnitId(unit1.Id, out var city1)) return; - if (!mapData.GetCityDataByUnitId(unit2.Id, out var city2)) return; - if (!mapData.GetGridDataByUnitId(unit1.Id, out var grid1)) return; - if (!mapData.GetGridDataByUnitId(unit2.Id, out var grid2)) return; - if (unit1.IsLimitSelfAttack(mapData)) return; + if (!mapData.GetPlayerDataByUnitId(unit1.Id, out var player1)) return false; + if (!mapData.GetPlayerDataByUnitId(unit2.Id, out var player2)) return false; + if (!mapData.GetCityDataByUnitId(unit1.Id, out var city1)) return false; + if (!mapData.GetCityDataByUnitId(unit2.Id, out var city2)) return false; + if (!mapData.GetGridDataByUnitId(unit1.Id, out var grid1)) return false; + if (!mapData.GetGridDataByUnitId(unit2.Id, out var grid2)) return false; + if (unit1.IsLimitSelfAttack(mapData)) return false; foreach (var skill in unit1.Skills) skill.BeforeSelfActiveAttack(mapData, unit1, unit2); // 计算攻击伤害 @@ -323,23 +323,74 @@ namespace Logic float counterAttackWait = attackBack + Table.Instance.AnimDataAssets.GetAttackTimeByAttackRange(unit2.GetAttackRange()) + Table.Instance.AnimDataAssets.BetweenAttackCounterAnimTime; //第一次攻击到对方后返回+对方反击打到我+对方返回的时刻 - var attackReturnTime = Table.Instance.AnimDataAssets.GetAttackReturnTimeByAttackRange(unit2.GetAttackRange()); - float counterAttackBack = counterAttackWait + attackReturnTime; + float counterAttackBack = counterAttackWait + + Table.Instance.AnimDataAssets.GetAttackReturnTimeByAttackRange( + unit2.GetAttackRange()); - var info1 = Main.UnitLogic.DamageSettlement(mapData, unit1, unit2, dmg1, DamageType.ActiveAttack); - if (info1.IsKill) + if (TestKillUnit(mapData,unit1,unit2,dmg1)) //如果伤害直接够杀死对方 { - if (unit1.GetAttackRange() == 1 && CheckUnitCanMoveToGrid(mapData, player1, unit1, grid2)) + + //攻击+移动:如果是近战且目标位置可以移动过去 + if (unit1.GetAttackRange() == 1 && CheckUnitCanMoveToGrid(mapData,player1,unit1,grid2)) { - Main.UnitLogic.MoveTo(mapData, unit1, grid2, MoveType.AttackMove); + unit1.AttackRenderMark = false; + var fragment = new MoveKill(); + fragment.Map = mapData; + fragment.Duration = Table.Instance.AnimDataAssets.MoveAnimTime; + fragment.Origin = unit1; + fragment.Target = unit2; + fragment.Dmg = dmg1; + fragment.OriginGrid = grid1; + fragment.TargetGrid = grid2; + fragment.OriginPlayer = player1; + fragment.TargetPlayer = player2; + duration = fragment.Duration; + if (isMoment) fragment.Excute(); + else TimelineManager.Instance.AddFragment(fragment); + } + else + { + var fragment = new NotMoveKill(); + fragment.Map = mapData; + fragment.Duration = attackBack; + fragment.Origin = unit1; + fragment.Target = unit2; + fragment.Dmg = dmg1; + fragment.OriginGrid = grid1; + fragment.TargetGrid = grid2; + fragment.OriginPlayer = player1; + fragment.TargetPlayer = player2; + fragment.AttackTime = attackWait; + fragment.AttackBackTime = attackBack; + duration = fragment.Duration; + if (isMoment) fragment.Excute(); + else TimelineManager.Instance.AddFragment(fragment); } } + //如果杀不死对方 else { - if (unit1.Health == 0 && unit2.Health == 0) return; - if (mapData.SameUnionByUnitId(unit1.Id, unit2.Id)) return; - Main.UnitLogic.DamageSettlement(mapData, unit2, unit1, dmg2, DamageType.CounterAttack); + var fragment = new AttackAndCounter(); + fragment.Map = mapData; + fragment.Duration = counterAttackBack; + fragment.Origin = unit1; + fragment.Target = unit2; + fragment.Dmg1 = dmg1; + fragment.Dmg2 = dmg2; + fragment.OriginGrid = grid1; + fragment.TargetGrid = grid2; + fragment.OriginPlayer = player1; + fragment.TargetPlayer = player2; + fragment.CanCounter = canCounter; + fragment.AttackAnimTime = Table.Instance.AnimDataAssets.AttackAnimTime; + fragment.CounterAttackStart = counterAttackStart; + fragment.CounterAttackWait = counterAttackWait; + fragment.CounterAttackBack = counterAttackBack; + duration = fragment.Duration; + if (isMoment) fragment.Excute(); + else TimelineManager.Instance.AddFragment(fragment); } + return true; } // 伤害新结算方法,所有的掉血都要走此方法,不允许直接修改UnitData.Health