Unity顶视相机上下拖动时Y轴偏移问题求助
解决顶视相机拖动时Y轴偏移问题
问题出在你用transform.right和transform.forward计算移动方向——顶视相机的transform.forward通常包含Y轴向下的分量(因为相机处于俯视姿态),导致拖动时会带动Y轴偏移。哪怕你尝试过固定Y坐标,也可能因为每帧移动代码的覆盖而失效。
下面是两种可行的解决方法:
方法1:清除移动方向的Y轴分量
直接将计算出的移动方向的Y轴分量置0,确保相机只在X-Z平面移动:
float moveSpeed = 3f; Vector3 moveDir = -transform.right * inputDir.x + -transform.forward * inputDir.z; // 移除Y轴方向的移动分量 moveDir.y = 0; transform.position += moveDir * moveSpeed * Time.deltaTime;
方法2:使用世界空间轴计算移动方向(适合严格顶视场景)
如果你的相机是严格垂直向下的顶视(比如旋转角度为(90,0,0)),可以直接用世界空间的X、Z轴构建移动方向,完全规避相机自身方向带来的Y轴干扰:
float moveSpeed = 3f; // 用世界坐标系的X、Z轴替代相机局部坐标系的right、forward Vector3 moveDir = -Vector3.right * inputDir.x + -Vector3.forward * inputDir.z; transform.position += moveDir * moveSpeed * Time.deltaTime;
额外优化:强制锁定Y坐标
如果需要相机始终保持固定Y高度,可以在每帧移动后强制设置Y坐标,避免任何意外的Y轴偏移:
transform.position += moveDir * moveSpeed * Time.deltaTime; // 固定Y坐标为40 transform.position = new Vector3(transform.position.x, 40, transform.position.z);
修改后的完整代码示例
using UnityEngine; public class ScrollWheelMove : MonoBehaviour { private bool DragMoveActive; private Vector2 LastMousePos; // 暴露参数到Inspector,方便调试调整 public float DragPanSpeed = 3f; public float DragVerticalSpeed = 6f; public float moveSpeed = 3f; public float fixedYPosition = 40f; private void Update() { Vector3 inputDir = Vector3.zero; if (Input.GetMouseButtonDown(2)) { DragMoveActive = true; LastMousePos = Input.mousePosition; } if (Input.GetMouseButtonUp(2)) { DragMoveActive = false; } if (DragMoveActive) { Vector2 mouseMovementDelta = (Vector2)Input.mousePosition - LastMousePos; inputDir.x = mouseMovementDelta.x * DragPanSpeed; inputDir.z = mouseMovementDelta.y * DragVerticalSpeed; LastMousePos = Input.mousePosition; } Vector3 moveDir = -transform.right * inputDir.x + -transform.forward * inputDir.z; moveDir.y = 0; transform.position += moveDir * moveSpeed * Time.deltaTime; // 强制锁定Y坐标 transform.position = new Vector3(transform.position.x, fixedYPosition, transform.position.z); } }
内容的提问来源于stack exchange,提问作者Gooo Gyyy
相关产品推荐
相关产品推荐

