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

Unity+Google VR SDK:Android VR游戏VR与普通模式切换及360旋转实现

解决方案:Unity + Google VR 实现 VR/普通模式双向切换及普通模式陀螺仪360旋转

嘿,我刚好做过类似的需求,给你整理一套亲测可行的方案,完美适配你的场景:

一、核心模式切换逻辑

你提到的XRSettings.enabled = true/false确实是切换的关键,但要配合Google VR的组件做适配,不然会出现相机异常:

1. 场景前置配置

  • 场景里保留GvrCameraRig(Google VR的核心相机组件),同时额外加一个普通模式专用的Camera(命名比如NormalCamera)
  • 初始状态默认设置:
    • VR模式:GvrCameraRig启用,NormalCamera禁用
    • 普通模式:GvrCameraRig禁用,NormalCamera启用

2. 切换控制代码

写一个单例管理类(比如VRModeManager)来统一处理切换逻辑:

using UnityEngine;
using UnityEngine.XR;

public class VRModeManager : MonoBehaviour
{
    public static VRModeManager Instance;
    public GvrCameraRig vrCameraRig;
    public Camera normalCamera;

    private void Awake()
    {
        Instance = this;
        // 启动时根据XR状态自动适配相机
        UpdateCameraState(XRSettings.enabled);
    }

    // 对外暴露的切换方法,绑定到UI按钮即可
    public void ToggleVRMode()
    {
        bool targetVRState = !XRSettings.enabled;
        XRSettings.enabled = targetVRState;
        // 延迟0.1秒更新相机,避免XR设置未生效导致的异常
        Invoke(nameof(UpdateCameraState), 0.1f);
    }

    private void UpdateCameraState(bool isVRMode)
    {
        vrCameraRig.gameObject.SetActive(isVRMode);
        normalCamera.gameObject.SetActive(!isVRMode);
        
        // 切换到普通模式时初始化陀螺仪
        if (!isVRMode)
        {
            GyroRotator.Instance.InitGyro();
        }
    }
}

二、普通模式陀螺仪360旋转实现

普通模式下需要把手机陀螺仪数据转换成相机的旋转,这里要处理坐标系的适配(手机和Unity的坐标系差异):

1. 陀螺仪控制脚本(GyroRotator)

把这个脚本挂在NormalCamera上:

using UnityEngine;

public class GyroRotator : MonoBehaviour
{
    public static GyroRotator Instance;
    private Camera targetCamera;
    private Quaternion initialCameraRot;

    private void Awake()
    {
        Instance = this;
        targetCamera = GetComponent<Camera>();
    }

    public void InitGyro()
    {
        // 启用陀螺仪
        Input.gyro.enabled = true;
        // 记录切换时的初始相机角度,避免旋转跳变
        initialCameraRot = targetCamera.transform.rotation;
    }

    private void Update()
    {
        // 仅在普通模式下生效
        if (!XRSettings.enabled)
        {
            // 转换陀螺仪坐标系:适配手机到Unity的轴映射,调整正负值修正旋转方向
            Quaternion gyroRot = new Quaternion(Input.gyro.attitude.x, Input.gyro.attitude.y, -Input.gyro.attitude.z, -Input.gyro.attitude.w);
            // 应用旋转,保持初始角度的基础上叠加陀螺仪数据
            targetCamera.transform.rotation = initialCameraRot * gyroRot;
        }
    }

    // 可选:添加重置旋转的方法,绑定到UI按钮
    public void ResetCameraRot()
    {
        targetCamera.transform.rotation = initialCameraRot;
    }
}

2. 注意事项

  • 打包Android时,Unity会自动添加陀螺仪权限,若遇到问题可手动在AndroidManifest.xml里确认<uses-feature android:name="android.hardware.sensor.gyroscope" />
  • 如果旋转方向不对,调整gyroRot里的轴正负值即可,不同设备可能有细微差异

三、体验优化建议

  • 切换模式时加个淡入淡出的过渡动画,避免画面突兀
  • 在UI角落放个明显的切换按钮,比如"VR模式"/"普通模式"切换键
  • 分别在有VR头显和无VR头显的设备上测试,确保切换逻辑稳定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:42:11