Unity第三人称游戏WASD控制相对相机方向问题求助
解决Unity第三人称WASD相对相机方向移动的问题
看来你碰到了第三人称角色移动里的经典坑——你的角色现在是基于世界坐标系做WASD移动,完全没考虑相机的视角方向,所以相机一转,WASD的控制逻辑直接就乱套了。别担心,这个问题很好解决,核心就是把移动参考系从世界空间切换到相机的局部空间。
问题根源
你当前的移动逻辑大概是直接用了transform.forward或transform.right(角色自身的世界方向)来计算移动向量,但相机旋转后,角色的自身方向和玩家视角里的前后左右已经不匹配了。比如相机转到角色身后,玩家按W想往前走(视角里的前),但角色却朝着自己的forward(世界里的前)移动,看起来就是往后走。
解决方案:基于相机视角计算移动方向
我们需要获取相机的水平前向和右向向量,用这个来构建WASD对应的移动方向,这样不管相机怎么转,W都是视角里的前,S是视角里的后,A/D是视角里的左右。
修改后的PlayerMovement.cs核心代码
假设你用的是CharacterController(第三人称游戏最常用的组件),修改你的移动逻辑如下:
using UnityEngine; public class PlayerMovement : MonoBehaviour { public float speed = 6f; public CharacterController controller; public Transform cameraTransform; // 在Inspector里把主相机拖到这里 void Update() { // 获取WASD的输入值 float horizontalInput = Input.GetAxis("Horizontal"); float verticalInput = Input.GetAxis("Vertical"); // 关键:获取相机的水平前向和右向,剔除Y轴分量(避免相机抬头时角色往上走) Vector3 cameraForward = Vector3.Scale(cameraTransform.forward, new Vector3(1, 0, 1)).normalized; Vector3 cameraRight = cameraTransform.right; // 计算相对于相机视角的移动方向 Vector3 moveDirection = (verticalInput * cameraForward + horizontalInput * cameraRight).normalized; // 应用移动 if (moveDirection.magnitude >= 0.1f) { controller.Move(moveDirection * speed * Time.deltaTime); } } }
如果你用的是Rigidbody
如果你的角色是用刚体驱动的,把移动逻辑放到FixedUpdate里,调整成这样:
using UnityEngine; public class PlayerMovement : MonoBehaviour { public float speed = 6f; public Rigidbody rb; void FixedUpdate() { float horizontalInput = Input.GetAxis("Horizontal"); float verticalInput = Input.GetAxis("Vertical"); Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized; Vector3 moveDirection = (verticalInput * cameraForward + horizontalInput * Camera.main.transform.right).normalized; // 保持Y轴的速度(比如跳跃的重力),只修改水平方向的速度 rb.velocity = new Vector3(moveDirection.x * speed, rb.velocity.y, moveDirection.z * speed); } }
关键细节说明
- 剔除Y轴分量:用
Vector3.Scale(cameraTransform.forward, new Vector3(1,0,1))是为了去掉相机前向向量里的Y值,确保角色只会在水平面上移动,不会因为相机抬头/低头而上下窜。 - 归一化移动向量:当同时按W+A这类斜向键时,移动向量的长度会大于1,归一化后可以保证斜向移动和正向移动的速度一致,避免“斜跑更快”的问题。
- 相机引用:如果用
Camera.main,确保你的主相机标签设为MainCamera;或者更稳妥的是在Inspector里手动拖入相机的Transform,避免Camera.main的性能开销。
CameraFollow的小提醒
你的相机跟随逻辑只要保证相机能围绕角色旋转(比如用Mouse X控制相机的Y轴旋转,Mouse Y控制X轴旋转),不需要修改太多——只要相机的Transform能正确反映玩家的视角方向,上面的移动逻辑就能生效。
内容的提问来源于stack exchange,提问作者Disko
相关产品推荐
相关产品推荐

