角色绕Y轴旋转180度后WASD移动反向问题排查
解决方案
问题根源是原代码用了世界空间的方向向量(Vector3.forward/Vector3.right),角色绕Y轴旋转后,WASD对应的世界方向和角色自身前后左右完全相反。而直接替换成transform.forward/transform.right时,只要保证跳跃逻辑只操作世界Y轴,就不会出现跳跃受鼠标控制的问题——你之前的误解可能是混淆了移动方向和跳跃方向的空间。
修改后的代码如下:
public void Update() { isGrounded = controller.isGrounded; if (isGrounded) { x = Input.GetAxis("Horizontal"); z = Input.GetAxis("Vertical"); // 落地时重置垂直速度,避免累计重力导致落地卡顿 velocity.y = 0f; } // 基于角色自身方向计算移动向量,剔除Y轴分量保证水平移动 Vector3 moveDir = transform.forward * z + transform.right * x; moveDir.y = 0f; // 归一化避免斜向移动速度翻倍 if (moveDir.magnitude > 1f) { moveDir.Normalize(); } controller.Move(moveDir * speed * Time.deltaTime); if (Input.GetButtonDown("Jump") && isGrounded) { // 跳跃速度仅操作世界Y轴,完全不受角色旋转影响 velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity); } velocity.y += gravity * Time.deltaTime; // 垂直方向移动用世界Y轴,和角色旋转无关 controller.Move(Vector3.up * velocity.y * Time.deltaTime); }
关键修改点:
- 移动方向改用
transform.forward/transform.right,但强制将Y轴置0,确保移动始终贴合水平地面,且方向随角色自身旋转变化,解决转身反向问题。 - 单独拆分垂直方向的移动(
Vector3.up),完全使用世界空间的Y轴,确保跳跃逻辑和角色旋转、相机视角彻底无关。 - 落地时重置
velocity.y,避免多次累计重力导致落地瞬间的异常速度。 - 对移动向量归一化,防止斜向移动时(同时按W+A)速度超过设定的
speed。
内容的提问来源于stack exchange,提问作者thehelaeper67
相关产品推荐
相关产品推荐

