TH1/Unity/Assets/Scripts/TH1_Anim/Fragments/FragmentNotMoveKill.cs

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);
}
}
}