You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:20:25