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; Owner.Combat?.EnableWeaponHitBox(AttackDirection.Down); var clip = Owner.Weapon?.ActiveWeapon?.downAttackClip; if (clip != null && clip.Clip != null) { var state = Anim.Play(clip); state.Events(this).OnEnd = OnClipEnd; } else if (AnimCfg?.DownAttack != null) { var state = Anim.Play(AnimCfg.DownAttack); state.Events(this).OnEnd = OnClipEnd; } else { 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 弹跳:命中敌人后向上弹起 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()); } } }