You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 3D状态机+新输入系统角色Strafing移动速度过快问题求助

问题分析与解决方案

问题根源

你的核心问题出在PlayerRunState的状态切换逻辑错误:当前代码中使用||(逻辑或)判断是否切回Idle状态,导致单独按一个方向键时(X或Z任一为0),角色会频繁在Run和Idle状态之间切换,移动逻辑无法每帧执行;而斜向移动时X和Z都不为0,状态稳定在Run,每帧都执行移动,因此看起来斜向速度更快。

修复步骤

  1. 修正PlayerRunState的状态切换条件
    将CheckSwitchState中的||改为&&,只有当X和Z方向都没有输入时,才切回Idle状态:
public override void CheckSwitchState()
{
    // 仅当X、Z轴都无输入时,切换到Idle状态
    if(ctx.XDir == 0 && ctx.ZDir == 0)
    {
        SwitchState(factory.Idle());
    }
}
  1. 验证输入值读取的正确性(可选但推荐)
    新输入系统中,WASD默认映射为Vector2类型的输入(A/D对应X轴,W/S对应Y轴),建议修正OnMove方法的读取逻辑,避免用Vector3读取导致的潜在问题:
void OnMove(InputAction.CallbackContext ctx_move)
{
    Vector2 input = ctx_move.ReadValue<Vector2>();
    xDir = input.x;
    zDir = input.y; // W/S对应前后方向,赋值给z轴
}
  1. 保留正确的归一化处理
    你当前在PlayerMove中对moveDir的归一化是正确的,确保了单方向和斜向移动的速度一致性,无需修改:
void PlayerMove()
{
    Vector3 moveDir = new Vector3(ctx.XDir, 0, ctx.ZDir).normalized;
    ctx.PlayerControl.Move(moveDir * 3 * Time.deltaTime);
}

内容的提问来源于stack exchange,提问作者Nicho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:29:49