TH1/Unity/Assets/Scripts/TH1_Anim/Fragments/FragmentAttackAlly.cs
2025-10-25 22:37:51 +08:00

132 lines
4.6 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 FragmentAttackAlly : FragmentBase
{
public FragmentAttackAllyData Data;
private ProjectileTypeInfo _attackInfo;
private bool _step1_attack;
private bool _step2_update;
private float _step1_start;
private float _step2_start;
private ProjectileType _projectileType;
public FragmentAttackAlly(FragmentAttackAllyData data) : base()
{
Data = data;
var animTable = Table.Instance.AnimDataAssets;
_projectileType = data.SkillType switch
{
SkillType.EIRINFRENCHATTACK => ProjectileType.Arrow,
SkillType.KAGUYAFRENCHATTACK => ProjectileType.KaguyaAttack,
SkillType.PATCHOULIEARTH => ProjectileType.PatchouliAttack,
SkillType.KOAKUMADEVOTION => ProjectileType.PatchouliAttack,
_ => ProjectileType.Arrow
};
if (!Table.Instance.ProjectileTypeDataAssets.GetProjectileTypeInfo(_projectileType, out _attackInfo))
{
State = FragmentState.Wrong;
return;
}
_step1_start = 0;
_step2_start = _step1_start + _attackInfo.AnimTime;
Duration = _step2_start + (_attackInfo.ProjectileType == ProjectileType.Melee ? animTable.AttackReturnAnimTime : 0);
}
public override bool CheckDone(float progressTime)
{
if (!_step1_attack || !_step2_update)
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;
var originPos = Data.OriginGrid.Pos.V2();
var targetPos = Data.TargetGrid.Pos.V2();
/*if (Data.SkillType == SkillType.EIRINFRENCHATTACK)
{
originPos += Vector3.up * 3;
}*/
var animData = UnitAtomAnimDataFactory.Create(UnitAtomAnimType.Projectile,_projectileType,originPos,targetPos);
Data.OriginUnitRenderer.AnimManager.EnqueueAnim(UnitAtomAnimType.Projectile,animData);
//更新我方unit显示
Data.OriginUnitRenderer.InstantUpdateUnit(false);
return;
}
//Step #2执行第二步 ->
if (progressTime >= _step2_start && !_step2_update)
{
_step2_update = true;
//更新受伤数据
Data.TargetUnitRenderer.InstantUpdateUnit(true);
//播放弹动效果
Data.TargetUnitRenderer.AnimManager.EnqueueAnim(UnitAtomAnimType.Bounce,UnitAtomAnimDataFactory.Create(UnitAtomAnimType.Bounce));
//播放特效
switch (Data.SkillType)
{
case SkillType.KAGUYAFRENCHATTACK:
Data.TargetGrid.Renderer(Main.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.KaguyaFrenchBuff));
break;
default:
Data.TargetGrid.Renderer(Main.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Heal));
break;
}
if (Data.OriginUnitDie)
{
Data.OriginGrid.Renderer(Main.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Die));
Data.OriginGrid.Renderer(Main.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Fog));
//Data.OriginGrid.Renderer(Main.MapData)?.PlayVFX(new GridVFXParams(GridVFXType.Hurt));
Data.OriginUnitRenderer.Die();
//更新死亡一方所属的城市的城市状态
Data.OriginUnitCity.SetCityRenderer(Main.MapData);
//重置周围单位的高亮状态
MapRenderer.Instance.UpdateAroundHighlight(Main.MapData,Data.OriginGrid);
}
}
}
}
}