如何让玩家对象旋转不影响Input.GetAxisRaw("Horizontal")输入?
问题解决:让Unity输入不受玩家旋转影响
你的问题根源在于移动方向是基于玩家本地空间坐标轴计算的——transform.right和transform.forward会跟着玩家旋转一起改变,所以Input.GetAxisRaw("Horizontal")的输入方向也会跟着偏移。要让输入固定,改用世界空间坐标轴即可。
修改步骤:
- 把移动方向计算里的
transform.forward替换为Vector3.forward,transform.right替换为Vector3.right,这样输入对应的是世界空间的固定方向(比如Horizontal对应世界左右,Vertical对应世界前后),和玩家自身旋转无关。 - 补上
verticalMovement的输入读取逻辑,你原代码中未给该变量赋值,导致前后移动功能失效。
修改后的完整代码:
using UnityEngine; public class JUSTMOVE : MonoBehaviour { public float speed = 7f; Vector3 moveDirection; public Rigidbody rb; float horizontalMovement; float verticalMovement; public float movementMultiplier = 10f; bool grounded; public float groundDrag = 6; public LayerMask whatIsGround; public float airMultiplier = 3f; public float playerHeight = 2f; public float jumpForce = 5f; void FixedUpdate() { grounded = Physics.Raycast(transform.position, Vector3.down, playerHeight * 0.5f + 0.2f, whatIsGround); // 读取水平和垂直输入 horizontalMovement = Input.GetAxisRaw("Horizontal"); verticalMovement = Input.GetAxisRaw("Vertical"); // 补全输入读取 rb.drag = grounded ? groundDrag : 0; // 改用世界空间坐标轴计算移动方向 moveDirection = Vector3.forward * verticalMovement + Vector3.right * horizontalMovement; if (grounded) { rb.AddForce(moveDirection.normalized * speed * movementMultiplier, ForceMode.Force); } else { rb.AddForce(moveDirection.normalized * speed * movementMultiplier * airMultiplier, ForceMode.Force); } if (Input.GetKey("a")) { transform.localRotation = Quaternion.Euler(0, 270, 0); } Vector3 flatVel = new Vector3(rb.velocity.x, 0f, rb.velocity.z); if (flatVel.magnitude > speed) { Vector3 limitedVel = flatVel.normalized * speed; rb.velocity = new Vector3(limitedVel.x, rb.velocity.y, limitedVel.z); } if (Input.GetKey("w") && grounded) { rb.velocity = new Vector3(rb.velocity.x, 0f, rb.velocity.z); rb.AddForce(transform.up * jumpForce, ForceMode.Impulse); } } }
修改完成后,无论你用Input.GetKey("a")将玩家转到什么角度,Input.GetAxisRaw的输入都会对应世界固定方向,不会再随玩家旋转偏移。
内容的提问来源于stack exchange,提问作者Cody Coder
相关产品推荐
相关产品推荐

