2025-09-26 16:50:42 +08:00

105 lines
3.7 KiB
C#

/*
* @Author: 白哉
* @Description:
* @Date: 2025年07月01日 星期二 14:07:05
* @Modify:
*/
using Logic.TH1_Anim;
using RuntimeData;
using TH1_Anim.UnitAtomAnim;
using TH1_DataAssetsScript;
using TH1_Renderer.UnitAtomAnim;
using TH1Renderer;
namespace TH1_Anim.Fragments
{
public class FragmentAttack : FragmentBase
{
public FragmentAttackAndCounterData Data;
private ProjectileTypeInfo _attackInfo;
private bool _step1_attack;
private bool _step2_attackmoveback;
private float _step1_start;
private float _step2_start;
public FragmentAttack(FragmentAttackAndCounterData data) : base()
{
Data = data;
var animTable = Table.Instance.AnimDataAssets;
if (!Table.Instance.ProjectileTypeDataAssets.GetProjectileTypeInfo(Data.AttackType, out _attackInfo))
{
State = FragmentState.Wrong;
return;
}
_step1_start = 0;
_step2_start = _step1_start + _attackInfo.AnimTime;
Duration = _attackInfo.ProjectileType == ProjectileType.Melee ? animTable.AttackReturnAnimTime : 0;
}
public override bool CheckDone(float progressTime)
{
if (!_step1_attack || !_step2_attackmoveback)
return false;
if (progressTime <= Duration)
return false;
return true;
}
public override void OnUpdate(float progressTime)
{
//Step #1执行第一步 -> 攻击
if (progressTime >= _step1_start && !_step1_attack)
{
_step1_attack = true;
//近战攻击
if (_attackInfo.ProjectileType == ProjectileType.Melee)
{
var animData = UnitAtomAnimDataFactory.Create(UnitAtomAnimType.AttackMove,Data.OriginGrid.Pos.V2(), Data.TargetGrid.Pos.V2());
Data.OriginUnitRenderer.AnimManager.EnqueueAnim(UnitAtomAnimType.AttackMove,animData);
}
else
//远战攻击
{
var animData = UnitAtomAnimDataFactory.Create(UnitAtomAnimType.Projectile,Data.OriginGrid.Pos.V2(), Data.TargetGrid.Pos.V2());
Data.OriginUnitRenderer.AnimManager.EnqueueAnim(UnitAtomAnimType.Projectile,animData);
}
return;
}
//Step #2执行第二步 -> 受伤 + 返回(如有)
if (progressTime >= _step2_start && !_step2_attackmoveback)
{
_step2_attackmoveback = true;
//更新受伤数据
Data.TargetUnitRenderer.RenderUpdateUnitAll();
//播放弹动效果
Data.TargetUnitRenderer.AnimManager.EnqueueAnim(UnitAtomAnimType.Bounce,UnitAtomAnimDataFactory.Create(UnitAtomAnimType.Bounce));
//播放特效
Data.TargetGrid.VFXRenderMarkHurt = true;
var t = new GridVFXRenderMark(GridVFXType.Damage);
t.Damage = Data.AttackDmg;
Data.TargetGrid.SetGridVFXRenderMark(t);
//如果是近战,做一个返回动画
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);
}
return;
}
}
}
}