using UnityEngine; using BaseGames.Combat; namespace BaseGames.Player.States { /// /// 下劈(踩踏 Pogo)状态(架构 05_PlayerModule §2)。 /// 需解锁 AbilityType.DownSlash 才能进入; /// 激活 HitBoxDown,着地或命中后弹跳。 /// public class DownAttackState : PlayerStateBase { private bool _hasHitEnemy; private bool _exited; public DownAttackState(PlayerController owner) : base(owner) { } public override void OnStateEnter() { _hasHitEnemy = false; _exited = false; if (Owner.Combat != null) Owner.Combat.OnDownHitConfirmed += OnDownHitConfirmed; var step = Owner.Weapon?.ActiveWeapon?.GetDirStep(AttackDirection.Down); float spd = Stats?.AnimatorSpeedMultiplier ?? 1f; if (step?.clip?.Clip != null) { var animState = Anim.Play(step.Value.clip); animState.Speed *= spd; var events = animState.Events(this); events.OnEnd = OnClipEnd; var s = step.Value; events.Add(s.hitBoxEnter, () => Owner.Combat?.EnableWeaponHitBox(AttackDirection.Down, s.hitBoxId)); events.Add(step.Value.hitBoxExit, () => Owner.Combat?.DisableAllWeaponHitBoxes()); } else { Owner.Combat?.EnableWeaponHitBox(AttackDirection.Down); OnClipEnd(); } // 施加向下的速度(下劈冲击) if (Move?.Rb != null) Move.Rb.velocity = new Vector2(Move.Rb.velocity.x, -18f); } public override void OnStateExit() { _exited = true; if (Owner.Combat != null) Owner.Combat.OnDownHitConfirmed -= OnDownHitConfirmed; Owner.Combat?.DisableAllWeaponHitBoxes(); } private void OnDownHitConfirmed(BaseGames.Combat.DamageInfo _) { if (_hasHitEnemy) return; _hasHitEnemy = true; // Pogo 弹跳:命中敌人后向上弹起,同时重置空中能力(等同落地效果) Owner.ResetAirJumps(); Owner.GetState()?.ResetDashCharge(); Move.Jump(); } public override void OnStateUpdate() { // 着地时回到 Idle / Run if (Move.IsGrounded) { Owner.TransitionTo(Owner.GetState()); } } private void OnClipEnd() { if (_exited) return; if (!Move.IsGrounded) Owner.TransitionTo(Owner.GetState()); else Owner.TransitionTo(Owner.GetState()); } } }