You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity 360视频播放器:陀螺仪与触摸滑动控制合并问题求助

解决Unity中陀螺仪与滑动视角控制冲突的问题

嘿,我明白你遇到的麻烦了——两个脚本各自独立修改相机的旋转值,导致后执行的那个直接覆盖了前一个的结果,自然没法同时生效。核心问题在于不要让两个脚本都直接设置transform.rotation,而是要把两种输入的旋转增量合并,用一个统一的逻辑来计算最终的相机旋转。

下面是整合后的解决方案,把陀螺仪控制和滑动Y轴视角控制合并到一个脚本里,这样两种输入就能协同工作了:

using UnityEngine;

public class CombinedCameraControls : MonoBehaviour
{
    private bool _gyroEnabled;
    private Gyroscope _gyro;
    private Quaternion _gyroRotation;
    
    // 滑动控制的灵敏度(可根据需求调整)
    [SerializeField] private float _slideSensitivity = 0.1f;
    // 记录上一帧的触摸位置
    private Vector2 _lastTouchPosition;
    // 累计的滑动Y轴旋转偏移(用于叠加在陀螺仪旋转上)
    private float _yRotationOffset;

    void Start()
    {
        // 初始化陀螺仪
        _gyroEnabled = EnableGyro();
    }

    bool EnableGyro()
    {
        if (SystemInfo.supportsGyroscope)
        {
            _gyro = Input.gyro;
            _gyro.enabled = true;
            
            // 调整陀螺仪坐标系到Unity的右手坐标系,避免旋转方向错乱
            transform.rotation = Quaternion.Euler(90f, 0f, 0f);
            _gyroRotation = new Quaternion(0, 0, 1, 0);
            
            return true;
        }
        Debug.LogWarning("当前设备不支持陀螺仪功能");
        return false;
    }

    void Update()
    {
        // 处理陀螺仪输入,获取基础旋转
        Quaternion targetRotation = Quaternion.identity;
        if (_gyroEnabled)
        {
            // 转换陀螺仪的姿态到Unity坐标系
            targetRotation = _gyro.attitude * _gyroRotation;
        }

        // 处理触摸滑动输入(控制Y轴视角旋转,即左右转头)
        if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began)
            {
                _lastTouchPosition = touch.position;
            }
            else if (touch.phase == TouchPhase.Moved)
            {
                // 计算X方向滑动距离(左右滑动对应Y轴旋转,即左右转头)
                float deltaX = touch.position.x - _lastTouchPosition.x;
                // 转换成旋转角度增量
                _yRotationOffset += deltaX * _slideSensitivity;
                // 可选:限制旋转范围,防止视角转得过度
                _yRotationOffset = Mathf.Clamp(_yRotationOffset, -180f, 180f);
                
                _lastTouchPosition = touch.position;
            }
        }

        // 合并两种输入的旋转:在陀螺仪基础旋转上叠加滑动的Y轴偏移
        Quaternion slideRotation = Quaternion.Euler(0f, _yRotationOffset, 0f);
        transform.rotation = slideRotation * targetRotation;
    }
}

关键逻辑说明:

  1. 坐标系适配:陀螺仪的默认坐标系和Unity的右手坐标系不一致,用_gyroRotation做轴翻转,确保旋转方向符合用户直觉。
  2. 增量式滑动控制:没有直接修改相机旋转,而是累计滑动带来的Y轴旋转偏移量,避免覆盖陀螺仪的基础旋转。
  3. 旋转合并:将滑动产生的Y轴旋转与陀螺仪的基础旋转相乘,让两种输入的效果叠加而非互斥。

灵活调整提示:

  • 如果你的滑动控制是想实现上下视角(X轴旋转),只需要把滑动计算的deltaX改成deltaY,将_yRotationOffset改为_xRotationOffset,最后在slideRotation里用Quaternion.Euler(_xRotationOffset, 0f, 0f)即可。
  • 可以通过修改_slideSensitivity调整滑动的灵敏度,数值越大,滑动相同距离对应的视角旋转幅度越大。
  • 编辑器内测试陀螺仪需要在Edit > Project Settings > Input System Package > Gyroscope中开启模拟,或者直接在真机上测试效果。

替换你原来的两个脚本,把这个整合后的脚本挂载到相机上,就能同时支持陀螺仪和滑动视角控制啦!

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

火山引擎 最新活动