119 lines
4.8 KiB
C#
119 lines
4.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;
|
|
|
|
private bool _step1_attack;
|
|
private bool _step2_moveback;
|
|
private bool _step3_updateunit;
|
|
|
|
private float _step1_start;
|
|
private float _step2_start;
|
|
private float _step3_start;
|
|
|
|
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;
|
|
}
|
|
_step1_start = 0;
|
|
_step2_start = _step1_start + _attackInfo.AnimTime;
|
|
_step3_start = _step2_start + (_attackInfo.ProjectileType == ProjectileType.Melee ? animTable.AttackReturnAnimTime : 0);
|
|
Duration = _step3_start;
|
|
|
|
}
|
|
|
|
public override bool CheckDone(float progressTime)
|
|
{
|
|
if (!_step1_attack || !_step2_moveback || !_step3_updateunit)
|
|
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.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);
|
|
}
|
|
return;
|
|
}
|
|
|
|
//Step #2执行第二步 -> 受伤 + 返回(如有)
|
|
if (progressTime >= _step2_start && !_step2_moveback)
|
|
{
|
|
_step2_moveback = true;
|
|
//让对方死亡
|
|
Data.TargetUnitRenderer.Die();
|
|
//更新死亡一方所属的城市的城市状态
|
|
Data.TargetCity.SetCityRenderer(Main.MapData);
|
|
//重置周围单位的高亮状态
|
|
MapRenderer.Instance.UpdateAroundHighlight(Main.MapData,Data.TargetGrid);
|
|
//更新我方Unit显示
|
|
Data.OriginUnitRenderer.InstantUpdateUnit(false);
|
|
//播放特效
|
|
Data.TargetGrid.Renderer(Main.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Hurt));
|
|
Data.TargetGrid.Renderer(Main.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Fog));
|
|
Data.TargetGrid.Renderer(Main.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Die));
|
|
Data.TargetGrid.Renderer(Main.MapData)?.PlayVFX(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);
|
|
}
|
|
return;
|
|
}
|
|
|
|
//Step #3执行第3步 -> 更新unit(比如说视野外)
|
|
if (progressTime >= _step3_start && !_step3_updateunit)
|
|
{
|
|
_step3_updateunit = true;
|
|
Data.OriginUnitRenderer.InstantUpdateUnit(true);
|
|
Data.TargetUnitRenderer.InstantUpdateUnit(true);
|
|
Data.OriginGrid.Renderer(Main.MapData)?.InstantUpdateGrid();
|
|
Data.TargetGrid.Renderer(Main.MapData)?.InstantUpdateGrid();
|
|
}
|
|
|
|
}
|
|
}
|
|
} |