攻击改瞬时

This commit is contained in:
wuwenbo 2025-09-23 17:39:42 +08:00
parent 214abcbac6
commit cbf5d3c36e
2 changed files with 18 additions and 69 deletions

View File

@ -14,7 +14,7 @@ namespace Logic
{
void MoveTo(MapData mapData, UnitData unitData, GridData gridData, MoveType moveType);
//unit[uid]移动到grid[pos]
bool Attack(MapData mapData, UnitData unitDataA, UnitData unitDataB, out float duration, bool isMoment=false);
void 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]升级

View File

@ -259,16 +259,16 @@ namespace Logic
return false;
}
public bool Attack(MapData mapData, UnitData unit1, UnitData unit2, out float duration, bool isMoment=false)
public void Attack(MapData mapData, UnitData unit1, UnitData unit2, out float duration, bool isMoment=false)
{
duration = 0;
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;
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;
foreach (var skill in unit1.Skills) skill.BeforeSelfActiveAttack(mapData, unit1, unit2);
// 计算攻击伤害
@ -330,74 +330,23 @@ namespace Logic
float counterAttackWait = attackBack + Table.Instance.AnimDataAssets.GetAttackTimeByAttackRange(unit2.GetAttackRange())
+ Table.Instance.AnimDataAssets.BetweenAttackCounterAnimTime;
//第一次攻击到对方后返回+对方反击打到我+对方返回的时刻
float counterAttackBack = counterAttackWait +
Table.Instance.AnimDataAssets.GetAttackReturnTimeByAttackRange(
unit2.GetAttackRange());
var attackReturnTime = Table.Instance.AnimDataAssets.GetAttackReturnTimeByAttackRange(unit2.GetAttackRange());
float counterAttackBack = counterAttackWait + attackReturnTime;
if (TestKillUnit(mapData,unit1,unit2,dmg1)) //如果伤害直接够杀死对方
var info1 = Main.UnitLogic.DamageSettlement(mapData, unit1, unit2, dmg1, DamageType.ActiveAttack);
if (info1.IsKill)
{
//攻击+移动:如果是近战且目标位置可以移动过去
if (unit1.GetAttackRange() == 1 && CheckUnitCanMoveToGrid(mapData,player1,unit1,grid2))
if (unit1.GetAttackRange() == 1 && CheckUnitCanMoveToGrid(mapData, player1, unit1, grid2))
{
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);
Main.UnitLogic.MoveTo(mapData, unit1, grid2, MoveType.AttackMove);
}
}
//如果杀不死对方
else
{
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);
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);
}
return true;
}
// 伤害新结算方法所有的掉血都要走此方法不允许直接修改UnitData.Health