namespace BaseGames.Player.States { /// /// 使用灵泉(治疗)状态(架构 05_PlayerModule §2)。 /// 消耗 SpringCharge,播放治愈动画;动画结束后回到 Idle。 /// 需在地面且有充能才能进入(PlayerController 负责条件检查)。 /// /// 动画在 Overlay Layer(Layer 1)播放,叠加于 Base Layer 的 Idle/Run 之上, /// 符合架构 05_PlayerModule §14 双层动画设计。 /// public class SpringState : PlayerStateBase { public SpringState(PlayerController owner) : base(owner) { } public override void OnStateEnter() { // 前摇开始时只扣除充能,不立即回血;回血在前摇结束后的 OnSpringEnd 中执行。 // 若前摇被打断(受伤 → HurtState),OnStateExit 被调用,充能已扣除但 OnSpringEnd 不会执行,回血失败。 bool used = Stats?.ConsumeSpringCharge() ?? false; if (!used) { Owner.TransitionTo(Owner.GetState()); return; } // 停止移动 Move?.ZeroHorizontalVelocity(); // 在 Overlay Layer(Layer 1)播放灵泉动画,叠加于 Base Layer 的 Idle 之上 if (AnimCfg?.UseSpring != null) { var state = Owner.PlayOnOverlay(AnimCfg.UseSpring); if (state != null) { state.Events(this).OnEnd = OnSpringEnd; return; } } // 无动画配置则直接结束(视为前摇瞬间完成) OnSpringEnd(); } public override void OnStateExit() { // 淡出叠加层,恢复纯 Base Layer 动画 Owner.StopOverlay(fadeDuration: 0.1f); } private void OnSpringEnd() { // 前摇正常结束 → 执行回血 + 反馈 Stats?.ApplySpringHeal(); Feedback.PlayHeal(); Owner.TransitionTo(Owner.GetState()); } } }