/* * @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.CreateUnitAtomAnimProjectile(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); } } } } }