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

Unity 360视频拖动脚本故障求助:按住左键相机沿Y轴左移

问题成因分析

问题描述

我尝试将如下脚本应用到360视频场景中,但遇到异常:仅按住鼠标左键未拖动时,相机就会沿Y轴向左偏移。

演示所用脚本代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class VRCamera : MonoBehaviour
{ 
    // 标记是否正在拖动
    public bool isDragging = false;

    // 相机移动的起始点
    float startMouseX;
    float startMouseY;

    // 相机组件
    public Camera cam;

    // Start在第一帧更新前调用
    void Start()
    {
        // 获取相机组件
        cam = this.gameObject.GetComponent<Camera>();
    }

    // Update每帧调用一次
    void Update()
    {
        // 按下左键且未开始拖动时
        if (Input.GetMouseButtonDown(0) && !isDragging)
        {
            // 设置拖动标记为真
            isDragging = true;

            // 保存鼠标起始位置
            startMouseX = Input.mousePosition.x;
            startMouseY = Input.mousePosition.y;
        }
        // 松开左键且之前在拖动时
        else if (Input.GetMouseButtonUp(0) && isDragging)
        {
            // 设置拖动标记为假
            isDragging = false;
        }
    }

    void LateUpdate()
    {
        // 检查是否正在拖动
        if (isDragging)
        {
            // 计算当前鼠标位置
            float endMouseX = Input.mousePosition.x;
            float endMouseY = Input.mousePosition.y;

            // 屏幕坐标差值
            float diffX = endMouseX - startMouseX;
            float diffY = endMouseY - startMouseY;

            // 新的屏幕中心
            float newCenterX = Screen.width / 2 + diffX;
            float newCenterY = Screen.height / 2 + diffY;

            // 获取世界坐标,这是相机要看向的点
            Vector3 LookHerePoint = cam.ScreenToWorldPoint(new Vector3(newCenterX, newCenterY, cam.nearClipPlane));

            // 让相机看向该点
            transform.LookAt(LookHerePoint);

            // 更新起始位置供下次调用使用
            startMouseX = endMouseX;
            startMouseY = endMouseY;
        }
    }
}

问题成因

  • 鼠标硬件的微小波动:即使你主观上没拖动鼠标,鼠标传感器本身的精度误差或系统输入采样的微小偏差,会让Input.mousePosition在每帧LateUpdate时产生像素级变化。脚本会将这个微小差值持续累加,最终表现为相机的持续偏移。
  • 360场景与原脚本逻辑不匹配:原脚本通过计算屏幕点转世界坐标、调用LookAt实现视角控制,这是平面场景的逻辑;而360视频场景需要的是相机环绕式旋转(仅调整欧拉角的Y/X轴)。原逻辑的LookAt会把鼠标的微小位置变化转化为相机的旋转偏移,在360场景中被放大。
  • 缺少移动阈值过滤:脚本没有设置鼠标移动的触发阈值,只要鼠标位置有1个像素的变化就会触发相机调整。这种无过滤的敏感响应,在按住鼠标但未主动拖动时,会把硬件波动转化为可见的相机偏移。

内容的提问来源于stack exchange,提问作者Radnovaxwavez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:01:30