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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:55:39