Unity 3D状态机+新输入系统角色Strafing移动速度过快问题求助
问题分析与解决方案
问题根源
你的核心问题出在PlayerRunState的状态切换逻辑错误:当前代码中使用||(逻辑或)判断是否切回Idle状态,导致单独按一个方向键时(X或Z任一为0),角色会频繁在Run和Idle状态之间切换,移动逻辑无法每帧执行;而斜向移动时X和Z都不为0,状态稳定在Run,每帧都执行移动,因此看起来斜向速度更快。
修复步骤
- 修正PlayerRunState的状态切换条件
将CheckSwitchState中的||改为&&,只有当X和Z方向都没有输入时,才切回Idle状态:
public override void CheckSwitchState() { // 仅当X、Z轴都无输入时,切换到Idle状态 if(ctx.XDir == 0 && ctx.ZDir == 0) { SwitchState(factory.Idle()); } }
- 验证输入值读取的正确性(可选但推荐)
新输入系统中,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轴 }
- 保留正确的归一化处理
你当前在PlayerMove中对moveDir的归一化是正确的,确保了单方向和斜向移动的速度一致性,无需修改:
void PlayerMove() { Vector3 moveDir = new Vector3(ctx.XDir, 0, ctx.ZDir).normalized; ctx.PlayerControl.Move(moveDir * 3 * Time.deltaTime); }
内容的提问来源于stack exchange,提问作者Nicho
相关产品推荐
相关产品推荐

