Unity正交相机拖拽上下速度过慢,如何实现各方向移动速度一致?
解决正交旋转相机拖拽速度不一致的问题
问题出在你直接用ScreenToWorldPoint获取世界坐标计算拖拽方向——相机旋转后,屏幕上下移动对应的世界X/Z轴分量比例失衡,导致移动速度不一致。直接改加速度没用,得从坐标转换的根源上调整。
核心思路:用屏幕坐标的偏移量计算移动,而非世界坐标差值,再把屏幕偏移转换成相机视角下的世界空间移动,保证各方向速度一致。
修改后的代码如下:
// 类成员变量 private bool isDragged; private Vector2 touchStartScreenPos; private Camera mainCam; void Start() { mainCam = Camera.main; } void Update() { if (Input.GetMouseButtonDown(0)) { isDragged = true; // 记录按下时的屏幕坐标,而非世界坐标 touchStartScreenPos = Input.mousePosition; } else if (Input.GetMouseButtonUp(0)) { isDragged = false; } if (isDragged && Input.GetMouseButton(0)) { // 计算屏幕上的拖拽偏移量 Vector2 screenDelta = touchStartScreenPos - (Vector2)Input.mousePosition; touchStartScreenPos = Input.mousePosition; // 更新起始位置,避免累积误差 // 计算屏幕像素对应的世界单位缩放因子 // 正交相机下,屏幕高度对应2*orthographicSize的世界高度 float worldUnitsPerPixelY = mainCam.orthographicSize * 2f / Screen.height; // 用宽高比修正X轴缩放,保证屏幕左右/上下的速度一致 float worldUnitsPerPixelX = worldUnitsPerPixelY * mainCam.aspect; // 将屏幕偏移转为相机本地空间的移动(本地X对应屏幕左右,本地Z对应屏幕上下) Vector3 localMove = new Vector3(screenDelta.x * worldUnitsPerPixelX, 0, screenDelta.y * worldUnitsPerPixelY); // 转换到世界空间,自动适配相机旋转角度 Vector3 worldMove = mainCam.transform.TransformDirection(localMove); worldMove.y = 0; // 保持Y轴高度不变 // 计算新位置并限制范围 Vector3 newPosition = mainCam.transform.position + worldMove; newPosition.x = Mathf.Clamp(newPosition.x, -45, 45); newPosition.z = Mathf.Clamp(newPosition.z, -45, 45); mainCam.transform.position = newPosition; } }
关键修改点说明:
- 放弃用
ScreenToWorldPoint记录起始点,改用原始屏幕坐标,避免相机旋转带来的坐标扭曲 - 利用正交相机的
orthographicSize和屏幕尺寸,精准计算屏幕像素对应的世界单位长度,保证屏幕左右/上下的移动缩放一致 - 将屏幕偏移转为相机本地空间移动,再通过
TransformDirection转到世界空间,让移动方向自动适配相机旋转,同时速度保持均匀
这样修改后,不管相机旋转角度如何,屏幕拖拽的左右和上下移动速度都会一致,且Y轴高度保持不变,X/Z范围限制也能正常生效。
内容的提问来源于stack exchange,提问作者Максим
相关产品推荐
相关产品推荐

