using UnityEngine;
namespace BaseGames.Player.States
{
///
/// 向下冲刺状态(空中下 + 冲刺触发)。
/// - 消耗空中冲刺次数(与普通冲刺共享,本次离地仅可用一次)。
/// - 关闭重力,施加向下速度,持续 DownDashDuration 秒。
/// - 提前着地或计时结束时退出。
/// - 需解锁 AbilityType.DownDash 才能进入(FallState / JumpState 负责条件检查)。
///
public class DownDashState : PlayerStateBase
{
private float _timer;
public DownDashState(PlayerController owner) : base(owner) { }
public override void OnStateEnter()
{
// 消耗空中冲刺次数(与普通空中冲刺互斥)
Owner.GetState()?.ConsumeAirDashCharge();
_timer = Cfg.DownDashDuration;
// 关闭重力,施加向下速度
Move?.SetGravityScale(0f);
Move?.DownDash(Cfg.DownDashSpeed);
// 优先播放专属动画,未配置时回退到 Fall 动画
var clip = AnimCfg?.DownDash ?? AnimCfg?.Fall;
if (clip != null) Anim?.Play(clip);
}
public override void OnStateUpdate()
{
_timer -= Time.deltaTime;
if (_timer <= 0f || Move.IsGrounded)
EndDownDash();
}
public override void OnStateFixedUpdate()
{
// 持续保持向下速度(防止摩擦力减速)
if (_timer > 0f && !Move.IsGrounded)
Move?.DownDash(Cfg.DownDashSpeed);
}
public override void OnStateExit()
{
Move?.SetGravityScale(Cfg.DefaultGravityScale);
}
private void EndDownDash()
{
Move?.ZeroVelocity();
if (Move != null && Move.IsGrounded)
Owner.TransitionTo(Owner.GetState());
else
Owner.TransitionTo(Owner.GetState());
}
}
}