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

Unity适配Quest2与安卓手机的APK开发问题咨询

解决方案:跨VR(Quest)/普通安卓/桌面的Unity多人应用开发与构建优化

一、核心问题说明

从adb报错日志可以明确:无法生成同时兼容Quest和普通安卓的单APK。Oculus XR插件的运行时检测机制会在非Oculus设备启动时强制退出应用,这是官方插件的设计限制,没有合规的绕过方案。必须分开构建两个安卓版本:Oculus VR版、普通安卓非VR版,结合桌面版本实现跨平台支持。

二、跨平台应用开发步骤

1. 模块化代码架构

将平台相关逻辑(XR输入、设备初始化、UI交互)与通用逻辑(多人通信、业务逻辑)彻底拆分:

  • 定义抽象接口,比如IPlatformInput、IDeviceInitializer,分别为Oculus、普通安卓、桌面实现对应类。
  • 用条件编译隔离平台代码,示例:
    #if OCULUS_BUILD
        public class OculusInput : IPlatformInput { /* Oculus手柄输入逻辑 */ }
    #elif ANDROID_NON_VR_BUILD
        public class TouchInput : IPlatformInput { /* 触屏输入逻辑 */ }
    #else
        public class DesktopInput : IPlatformInput { /* 键鼠输入逻辑 */ }
    #endif
    

2. XR配置与权限管理

  • 在Unity的XR Plugin Management中,不要同时启用多个安卓XR插件。Oculus版仅启用Oculus Loader,普通安卓版禁用所有XR Loader。
  • 权限与Manifest:为两个版本准备独立的Manifest模板:
    • Oculus版:添加Oculus所需的权限(如android.permission.RECORD_AUDIO、Oculus特定的com.oculus.permission.MEDIA),以及VR相关的<meta-data>。
    • 普通安卓版:仅保留网络、存储等必要权限,移除所有VR相关配置。

3. 场景与平台检测逻辑

保留你已有的场景切换脚本,补充精准的平台检测:

void Start()
{
    if (Application.platform == RuntimePlatform.Android)
    {
        // 判断是否为Oculus设备
        bool isOculus = XRDevice.model.Contains("Oculus") || UnityEngine.XR.Oculus.OVRPlugin.isOculusDevice;
        if (isOculus)
        {
            LoadVRScene();
        }
        else
        {
            LoadNonVRAndroidScene();
        }
    }
    else if (Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.OSXPlayer)
    {
        LoadDesktopScene();
    }
}

4. 跨平台测试

分别在桌面、Quest、普通安卓设备上验证:

  • 确保多人通信模块(如Photon、Mirror)在所有平台上能正常连接同一服务器。
  • 测试各自平台的输入、UI逻辑是否独立运行正常。

三、快速版本切换与自动化构建方案

1. 一键切换配置的Editor脚本

编写Unity Editor脚本,实现点击按钮自动切换构建配置(XR插件、宏定义、Manifest):

using UnityEditor;
using UnityEditor.XR.Management;

public class BuildConfigSwitcher
{
    // 切换到Oculus构建配置
    [MenuItem("Build Tools/Switch to Oculus Build")]
    public static void SwitchToOculus()
    {
        // 启用Oculus XR Loader
        var xrSettings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(BuildTargetGroup.Android);
        xrSettings.InitManagerOnStart = true;
        var loaderManager = xrSettings.AssignedSettings;
        loaderManager.Loaders.Clear();
        var oculusLoader = loaderManager.Loaders.Find(l => l.name.Equals("Oculus Loader"));
        if (oculusLoader != null) loaderManager.Loaders.Add(oculusLoader);

        // 设置编译宏
        PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, "OCULUS_BUILD");
        // 指定Oculus专属Manifest
        PlayerSettings.SetCustomAndroidManifestPath("Assets/Configs/OculusManifest.xml");

        AssetDatabase.SaveAssets();
        EditorUtility.DisplayDialog("提示", "已切换到Oculus构建配置", "确定");
    }

    // 切换到普通安卓非VR构建配置
    [MenuItem("Build Tools/Switch to Non-VR Android Build")]
    public static void SwitchToNonVRAndroid()
    {
        // 禁用所有XR Loader
        var xrSettings = XRGeneralSettingsPerBuildTarget.XRGeneralSettingsForBuildTarget(BuildTargetGroup.Android);
        xrSettings.InitManagerOnStart = false;
        var loaderManager = xrSettings.AssignedSettings;
        loaderManager.Loaders.Clear();

        // 设置编译宏
        PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.Android, "ANDROID_NON_VR_BUILD");
        // 指定普通安卓Manifest
        PlayerSettings.SetCustomAndroidManifestPath("Assets/Configs/NonVRAndroidManifest.xml");

        AssetDatabase.SaveAssets();
        EditorUtility.DisplayDialog("提示", "已切换到普通安卓非VR构建配置", "确定");
    }
}

2. 一键批量构建

在上述脚本中添加构建方法,实现点击按钮直接打包:

[MenuItem("Build Tools/Build Oculus APK")]
public static void BuildOculusAPK()
{
    SwitchToOculus();
    BuildPipeline.BuildPlayer(EditorBuildSettings.scenes, "Builds/Oculus/MyApp.apk", BuildTarget.Android, BuildOptions.None);
}

[MenuItem("Build Tools/Build Non-VR Android APK")]
public static void BuildNonVRAndroidAPK()
{
    SwitchToNonVRAndroid();
    BuildPipeline.BuildPlayer(EditorBuildSettings.scenes, "Builds/NonVRAndroid/MyApp.apk", BuildTarget.Android, BuildOptions.None);
}

[MenuItem("Build Tools/Build All Platforms")]
public static void BuildAll()
{
    // 构建Oculus
    BuildOculusAPK();
    // 构建普通安卓
    BuildNonVRAndroidAPK();
    // 构建桌面Windows版
    BuildPipeline.BuildPlayer(EditorBuildSettings.scenes, "Builds/Desktop/MyApp.exe", BuildTarget.StandaloneWindows64, BuildOptions.None);
}

3. 命令行自动化构建

通过Unity命令行实现无界面批量构建,适合CI/CD集成:

# Oculus版本构建命令(Windows)
Unity.exe -batchmode -quit -projectPath "D:/YourProject" -executeMethod BuildConfigSwitcher.BuildOculusAPK

# 普通安卓版本构建命令(Windows)
Unity.exe -batchmode -quit -projectPath "D:/YourProject" -executeMethod BuildConfigSwitcher.BuildNonVRAndroidAPK

# Mac平台命令
/Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -quit -projectPath "/Users/You/YourProject" -executeMethod BuildConfigSwitcher.BuildOculusAPK

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:15:40