95 lines
3.8 KiB
C#
95 lines
3.8 KiB
C#
/*
|
|
* @Author: 白哉
|
|
* @Description:
|
|
* @Date: 2025年07月01日 星期二 14:07:05
|
|
* @Modify:
|
|
*/
|
|
|
|
|
|
using RuntimeData;
|
|
using TH1_Anim.UnitAtomAnim;
|
|
using TH1_DataAssetsScript;
|
|
using TH1_Logic.Core;
|
|
using TH1_Renderer.UnitAtomAnim;
|
|
using TH1Renderer;
|
|
using UnityEngine;
|
|
|
|
namespace TH1_Anim.Fragments
|
|
{
|
|
public class FragmentNotMoveKill : FragmentBase
|
|
{
|
|
public FragmentAttackAndCounterData Data;
|
|
|
|
private ProjectileTypeInfo _attackInfo;
|
|
|
|
public FragmentNotMoveKill(FragmentAttackAndCounterData data) : base()
|
|
{
|
|
Data = data;
|
|
var animTable = Table.Instance.AnimDataAssets;
|
|
if (!Table.Instance.ProjectileTypeDataAssets.GetProjectileTypeInfo(Data.AttackType, out _attackInfo))
|
|
{
|
|
Debug.Log("projectileInfo can't find");
|
|
State = FragmentState.Wrong;
|
|
return;
|
|
}
|
|
|
|
InitSteps();
|
|
|
|
// Step #1 攻击弹道
|
|
AddStep(AnimPhase.AttackStart, _attackInfo.AnimTime, () =>
|
|
{
|
|
if (_attackInfo.ProjectileType == ProjectileType.Melee)
|
|
{
|
|
var animData = UnitAtomAnimDataFactory.Create(UnitAtomAnimType.Move, Data.OriginGrid.Pos.V2(), Data.TargetGrid.Pos.V2());
|
|
Data.OriginUnitRenderer.AnimManager.EnqueueAnim(UnitAtomAnimType.AttackMove, animData);
|
|
}
|
|
else
|
|
{
|
|
var animData = UnitAtomAnimDataFactory.CreateUnitAtomAnimProjectile(UnitAtomAnimType.Projectile, _attackInfo.ProjectileType, Data.OriginGrid.Pos.V2(), Data.TargetGrid.Pos.V2());
|
|
Data.OriginUnitRenderer.AnimManager.EnqueueAnim(UnitAtomAnimType.Projectile, animData);
|
|
}
|
|
});
|
|
|
|
// Step #2 命中 -> 死亡 + 返回(如有)
|
|
float attackReturnDur = _attackInfo.ProjectileType == ProjectileType.Melee ? animTable.AttackReturnAnimTime : 0;
|
|
AddStep(AnimPhase.AttackImpact, attackReturnDur, () =>
|
|
{
|
|
Data.TargetUnitRenderer.Die();
|
|
Data.TargetCity.SetCityRenderer(Main.MapData);
|
|
MapRenderer.Instance.UpdateAroundHighlight(Main.MapData, Data.TargetGrid);
|
|
Data.OriginUnitRenderer.InstantUpdateUnit(false);
|
|
Data.TargetGrid.Renderer(Main.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Hurt));
|
|
Data.TargetGrid.Renderer(Main.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Fog));
|
|
if (!Data.TargetCanNotBeKilled)
|
|
Data.TargetGrid.Renderer(Main.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Die));
|
|
Data.TargetGrid.Renderer(Main.MapData)?.PlayVFXInSight(new GridVFXParams(GridVFXType.Damage, Data.AttackDmg));
|
|
if (_attackInfo.ProjectileType == ProjectileType.Melee)
|
|
{
|
|
var animData = UnitAtomAnimDataFactory.Create(UnitAtomAnimType.AttackMoveBack, Data.OriginGrid.Pos.V2(), Data.TargetGrid.Pos.V2());
|
|
Data.OriginUnitRenderer.AnimManager.EnqueueAnim(UnitAtomAnimType.AttackMoveBack, animData);
|
|
}
|
|
});
|
|
|
|
// Step #3 收尾 -> 更新unit状态
|
|
AddStep(AnimPhase.Settle, 0, () =>
|
|
{
|
|
Data.OriginUnitRenderer.InstantUpdateUnit(true);
|
|
Data.TargetUnitRenderer.InstantUpdateUnit(true);
|
|
Data.OriginGrid.Renderer(Main.MapData)?.InstantUpdateGrid();
|
|
Data.TargetGrid.Renderer(Main.MapData)?.InstantUpdateGrid();
|
|
});
|
|
|
|
RecalcDuration();
|
|
}
|
|
|
|
public override bool CheckDone(float progressTime)
|
|
{
|
|
return CheckStepsDone(progressTime);
|
|
}
|
|
|
|
public override void OnUpdate(float progressTime)
|
|
{
|
|
UpdateSteps(progressTime);
|
|
}
|
|
}
|
|
} |