角色能力,存档
This commit is contained in:
@@ -30,7 +30,12 @@ namespace BaseGames.Player.States
|
||||
Anim.Play(AnimCfg.Jump);
|
||||
|
||||
if (_isDoubleJump)
|
||||
{
|
||||
Move.DoubleJump();
|
||||
// 优先播放专属空中跳跃动画,未配置时回退到普通跳跃动画
|
||||
var airJumpClip = AnimCfg?.AirJump ?? AnimCfg?.Jump;
|
||||
if (airJumpClip != null) Anim?.Play(airJumpClip);
|
||||
}
|
||||
else
|
||||
Move.Jump();
|
||||
|
||||
@@ -47,40 +52,88 @@ namespace BaseGames.Player.States
|
||||
return;
|
||||
}
|
||||
|
||||
// 空中冲刺(优先于二段跳:冲刺可保存二段跳机会)
|
||||
if (Buffer.ConsumeDash()
|
||||
&& Stats != null && Stats.HasAbility(AbilityType.AirDash))
|
||||
// 冲刺(地面/空中统一使用 DashState,空中限一次,优先于二段跳:冲刺可保存二段跳机会)
|
||||
// 先确认能力与冷却均满足,再消耗缓冲,避免无操作时静默吃掉输入
|
||||
var dashState = Owner.GetState<DashState>();
|
||||
if (dashState != null && dashState.CanAirDash
|
||||
&& Stats != null && Stats.HasAbility(AbilityType.Dash)
|
||||
&& Buffer.ConsumeDash())
|
||||
{
|
||||
var aerialDash = Owner.GetState<AerialDashState>();
|
||||
if (aerialDash != null && aerialDash.HasAerialDash)
|
||||
{
|
||||
_owner.TransitionTo(aerialDash);
|
||||
return;
|
||||
}
|
||||
_owner.TransitionTo(dashState);
|
||||
return;
|
||||
}
|
||||
|
||||
// 二段跳:上升阶段即可触发(上升途中任意时刻可二段跳)
|
||||
if (Buffer.ConsumeJump() && Owner.AirJumpsLeft > 0)
|
||||
// 二段跳:上升阶段即可触发(先确认有次数再消耗缓冲,避免静默消耗)
|
||||
if (Owner.AirJumpsLeft > 0 && Buffer.ConsumeJump())
|
||||
{
|
||||
Owner.UseAirJump();
|
||||
Move.DoubleJump();
|
||||
// 留在 JumpState:速度截断(JumpCancelledEvent)和落地检测逻辑继续生效
|
||||
if (AnimCfg?.Jump != null) Anim?.Play(AnimCfg.Jump);
|
||||
// 播放空中跳跃动画,未配置时回退到 Jump
|
||||
var airJumpClip = AnimCfg?.AirJump ?? AnimCfg?.Jump;
|
||||
if (airJumpClip != null) Anim?.Play(airJumpClip);
|
||||
return;
|
||||
}
|
||||
// 空中攻击:Move Y > 0 → 上劈;Y < -0.5 且解锁下劈 → 下劈;其余 → 空中攻击
|
||||
if (Buffer.ConsumeAttack())
|
||||
{
|
||||
if (Input.MoveInput.y > 0.5f)
|
||||
_owner.TransitionTo(_owner.GetState<UpAttackState>());
|
||||
else if (Input.MoveInput.y < -0.5f
|
||||
&& Stats != null && Stats.HasAbility(AbilityType.DownSlash))
|
||||
_owner.TransitionTo(_owner.GetState<DownAttackState>());
|
||||
else
|
||||
_owner.TransitionTo(_owner.GetState<AirAttackState>());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public override void OnStateFixedUpdate()
|
||||
{
|
||||
// 空中水平移动:有输入时立即覆盖至目标速度;无输入时施加空气阻力保留动量
|
||||
if (Mathf.Abs(Input.MoveInput.x) > 0.01f)
|
||||
Move.Move(Input.MoveInput.x * Cfg.RunSpeed);
|
||||
// ── 顶点悬停:第一判断 |vy|,动态切换重力缩放系数 ────────────────
|
||||
// |垂直速度| 低于顶点阈值时,重力缩减至 ApexGravityMultiplier 倍,
|
||||
// 产生角色在跳跃顶点起起“滒空”的手感,属于高重力平台游戏的标志性特征。
|
||||
// 转入 FallState 时 OnStateExit 会恢复默认重力,不会漏到 FallState。
|
||||
float absVY = Mathf.Abs(Move.Rb.velocity.y);
|
||||
if (absVY < Cfg.ApexThreshold)
|
||||
Move.SetGravityScale(Cfg.DefaultGravityScale * Cfg.ApexGravityMultiplier);
|
||||
else
|
||||
Move.ApplyAirDrag(Cfg.AirDragFactor);
|
||||
Move.SetGravityScale(Cfg.DefaultGravityScale);
|
||||
|
||||
// ── 空中水平移动(朝向墙壁时停止施力,防止贴墙悬停)──────────────
|
||||
if (Mathf.Abs(Input.MoveInput.x) > 0.01f)
|
||||
{
|
||||
int inputDir = Input.MoveInput.x > 0 ? 1 : -1;
|
||||
var wd = Owner.WallDetector;
|
||||
if (wd != null && wd.IsTouchingWall && wd.WallDirection == inputDir)
|
||||
{
|
||||
// 按下朝墙方向键 + 在墙上(且未著地)→ 进入抓墙状态
|
||||
var wss = Owner.GetState<WallSlideState>();
|
||||
if (wss != null && !Move.IsGrounded)
|
||||
{
|
||||
wss.PrepareEnter(inputDir);
|
||||
Owner.TransitionTo(wss);
|
||||
return;
|
||||
}
|
||||
Move.ZeroHorizontalVelocity();
|
||||
}
|
||||
else if (wd != null && wd.HasPartialContact(inputDir))
|
||||
{
|
||||
// 仅部分射线命中(如检测点高于矮墙顶部),停止施加朝墙方向的水平速度,
|
||||
// 防止角色边角被卡在墙顶而无法继续下落。
|
||||
Move.ZeroHorizontalVelocity();
|
||||
}
|
||||
else
|
||||
Move.Move(Input.MoveInput.x * Cfg.RunSpeed);
|
||||
}
|
||||
else
|
||||
Move.ZeroHorizontalVelocity();
|
||||
}
|
||||
|
||||
public override void OnStateExit()
|
||||
{
|
||||
// 顶点悬停可能已降低重力,离开本状态时必须恢复;
|
||||
// 否则进入 FallState/DashState 等后续状态时重力仍低于默认值。
|
||||
Move.SetGravityScale(Cfg.DefaultGravityScale);
|
||||
Input.JumpCancelledEvent -= OnJumpCancelled;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user