Unity正交相机右键平移问题:固定Y轴且各方向速度一致
解决正交相机平移的Y轴固定与速度一致问题
你的问题核心在于屏幕坐标转世界坐标时引入了Y轴干扰,以及固定Y轴后破坏了原本的平移向量计算逻辑,导致速度不一致。下面是修正后的代码,同时解决两个问题:
[SerializeField] private Camera cam; private Vector2 dragOriginScreen; // 改用屏幕坐标记录起点,避免Y轴干扰 public float speed = 10f; private void Update() { if (Input.GetMouseButtonDown(1)) { // 记录鼠标按下时的屏幕坐标(只取X、Y屏幕轴) dragOriginScreen = Input.mousePosition; } if (Input.GetMouseButton(1)) { // 计算鼠标当前与起点的屏幕偏移 Vector2 screenDelta = dragOriginScreen - (Vector2)Input.mousePosition; // 将屏幕偏移转换为世界空间的平移量:正交相机下,屏幕高度对应2倍正交尺寸 float worldUnitsPerPixel = cam.orthographicSize * 2f / Screen.height; Vector3 worldDelta = new Vector3(screenDelta.x, 0, screenDelta.y) * worldUnitsPerPixel; // 应用平移,保持Y轴固定 Vector3 targetPosition = cam.transform.position + worldDelta * speed * Time.deltaTime; targetPosition.y = cam.transform.position.y; // 强制固定Y轴高度 cam.transform.position = targetPosition; } }
关键改动说明:
- 改用屏幕坐标记录拖拽起点:避免
ScreenToWorldPoint带来的Y轴干扰,因为正交相机的ScreenToWorldPoint会根据相机位置计算世界坐标,Y值会随相机高度变化。 - 屏幕偏移转世界空间的逻辑:通过正交相机的
orthographicSize计算屏幕像素对应的世界单位,保证X/Z方向的平移速度完全一致——因为我们直接用屏幕偏移的比例来转换,不会因Y轴固定导致向量长度变化。 - 直接平移而非Lerp:原来的
Lerp会导致速度非线性,换成直接累加偏移量的方式,速度更稳定可控。如果想要平滑效果,可以在最后加上Vector3.Lerp,但要保证Y轴始终固定。
如果还是想用Lerp实现平滑,可修改最后几行:
Vector3 targetPosition = cam.transform.position + worldDelta * speed; targetPosition.y = cam.transform.position.y; cam.transform.position = Vector3.Lerp(cam.transform.position, targetPosition, Time.deltaTime * 5f);
这样既保证了Y轴高度固定,又能让X/Z方向的平移速度完全一致,符合你的各向同性场景需求。
内容的提问来源于stack exchange,提问作者Leyonad
相关产品推荐
相关产品推荐

