3D等距游戏角色移动方向修正问题求助
3D等距视角角色屏幕方向移动解决方案
问题描述
制作3D等距视角游戏时遇到角色移动方向匹配问题:
- 相机参数:X轴旋转30°、Y轴旋转45°,正交投影模式
- 异常表现:按下W键时角色向西北45度斜向移动,需求是让角色沿屏幕向上方向移动
- 无效尝试:修改所有资源旋转耗时过长;自行调整代码导致移动逻辑混乱
原始移动脚本
using UnityEngine; public class PlayerMovement : MonoBehaviour { public float speed, rotationSpeed; public Joystick joystick; private CharacterController characterController; void Start() { characterController = GetComponent<CharacterController>(); } void FixedUpdate() { float horizontalInput = Input.GetAxis("Horizontal"); float verticalInput = Input.GetAxis("Vertical"); Vector3 movementDirection = new Vector3(horizontalInput, 0, verticalInput); float magnitude = Mathf.Clamp01(movementDirection.magnitude) * speed; movementDirection.Normalize(); characterController.SimpleMove(movementDirection * magnitude); if (movementDirection != Vector3.zero) { Quaternion toRotation = Quaternion.LookRotation(movementDirection, Vector3.up); transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, rotationSpeed * Time.deltaTime); } } }
解决方案
核心逻辑是将输入方向从世界空间坐标系转换为相机视角下的水平平面坐标系,让键盘输入直接对应屏幕直观方向。修改后的脚本如下:
using UnityEngine; public class PlayerMovement : MonoBehaviour { public float speed, rotationSpeed; public Joystick joystick; private CharacterController characterController; void Start() { characterController = GetComponent<CharacterController>(); } void FixedUpdate() { float horizontalInput = Input.GetAxis("Horizontal"); float verticalInput = Input.GetAxis("Vertical"); // 获取相机的前向和右向,并剔除Y轴分量(保持在水平平面) Vector3 cameraForward = Camera.main.transform.forward; cameraForward.y = 0; cameraForward.Normalize(); Vector3 cameraRight = Camera.main.transform.right; cameraRight.y = 0; cameraRight.Normalize(); // 基于相机空间构建移动方向:W/S对应屏幕上下,A/D对应屏幕左右 Vector3 movementDirection = cameraRight * horizontalInput + cameraForward * verticalInput; float magnitude = Mathf.Clamp01(movementDirection.magnitude) * speed; movementDirection.Normalize(); characterController.SimpleMove(movementDirection * magnitude); if (movementDirection != Vector3.zero) { Quaternion toRotation = Quaternion.LookRotation(movementDirection, Vector3.up); transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, rotationSpeed * Time.deltaTime); } } }
关键修改说明
- 获取相机的
forward和right方向后,强制将Y轴设为0,确保移动方向始终在水平地面上 - 用相机空间的方向重新构建移动向量,此时
verticalInput=1(W键)对应的就是屏幕向上的方向,完全匹配玩家直观操作 - 角色旋转逻辑保持不变,基于转换后的移动方向,确保角色朝向移动的屏幕方向
内容的提问来源于stack exchange,提问作者Richard Johnson
相关产品推荐
相关产品推荐

