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
相关产品推荐
相关产品推荐

