using UnityEngine; using BaseGames.Combat; namespace BaseGames.Player.States { /// /// 受击硬直状态(架构 05_PlayerModule §2)。 /// 由 PlayerController.TakeDamage 在玩家非无敌时触发; /// 播放 Hurt 动画,施加击退,结束后回到 Idle 或 Fall。 /// public class HurtState : PlayerStateBase { private float _timer; private bool _ended; public HurtState(PlayerController owner) : base(owner) { } public void Initialize(BaseGames.Combat.DamageInfo info) { // 由 PlayerController.TakeDamage 传入伤害信息 if (info.KnockbackForce > 0.01f) Move?.ApplyKnockback(info.KnockbackDirection, info.KnockbackForce); } public override void OnStateEnter() { // 持续时长从 PlayerAnimationConfigSO 读取,不同攻击可设置不同硬直 _timer = Owner.AnimConfig?.HurtDuration ?? 0.4f; _ended = false; Stats?.BeginInvincibility(); Feedback.PlayTakeHit(); if (AnimCfg?.Hurt != null) { var state = Anim?.Play(AnimCfg.Hurt); if (state != null) state.Events(this).OnEnd = OnHurtEnd; } } public override void OnStateUpdate() { _timer -= Time.deltaTime; if (_timer <= 0f) OnHurtEnd(); } private void OnHurtEnd() { if (_ended) return; _ended = true; if (Stats != null && !Stats.IsAlive) { Owner.TransitionTo(Owner.GetState()); return; } if (Move.IsGrounded) Owner.TransitionTo(Owner.GetState()); else Owner.TransitionTo(Owner.GetState()); } } }