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

Unity中动态切换ARFoundation与Google Cardboard XR Loader失败求助

XR Loader按需程序化初始化解决方案

核心问题原因

手动调用单个XRLoader的Initialize、Start方法后,XR Plugin Manager的activeLoader字段未被同步赋值,管理器无法识别到已激活的Loader,后续调用StartSubsystems时找不到对应的子系统实现,因此抛出无可用XRSessionSubsystem的警告。

修复方案

1. 逻辑调整要点

初始化指定Loader完成后,主动调用接口将其设置为XR Plugin Manager的活跃Loader,再触发全局子系统启动。初始化前需先清空之前的活跃Loader状态,避免多Loader冲突。

2. 完整可运行代码

using System.Collections;
using UnityEngine;
using UnityEngine.XR.Management;

public class RuntimeXRLoaderManager : MonoBehaviour
{
    private XRLoader m_SelectedXRLoader;

    /// <summary>
    /// 启动指定索引的XR Loader
    /// </summary>
    /// <param name="loaderIndex">XR Plugin Management中配置的Loader列表索引</param>
    public void StartXR(int loaderIndex)
    {
        // 先卸载之前运行的XR实例
        if (m_SelectedXRLoader != null)
        {
            StopXR();
        }

        // 索引合法性校验
        var loaderList = XRGeneralSettings.Instance.Manager.activeLoaders;
        if (loaderIndex < 0 || loaderIndex >= loaderList.Count)
        {
            Debug.LogError("Loader索引超出配置范围");
            return;
        }
        m_SelectedXRLoader = loaderList[loaderIndex];
        StartCoroutine(StartXRCoroutine());
    }

    private IEnumerator StartXRCoroutine()
    {
        Debug.Log("开始初始化XR Loader");

        // 清空管理器之前的活跃Loader状态
        if (XRGeneralSettings.Instance.Manager.activeLoader != null)
        {
            XRGeneralSettings.Instance.Manager.DeinitializeLoader();
        }

        // 初始化选中的Loader
        bool initSuccess = m_SelectedXRLoader.Initialize();
        if (!initSuccess)
        {
            Debug.LogError("XR Loader初始化失败");
            yield break;
        }

        Debug.Log("启动XR Loader");
        bool startSuccess = m_SelectedXRLoader.Start();
        if (!startSuccess)
        {
            Debug.LogError("XR Loader启动失败");
            m_SelectedXRLoader.Deinitialize();
            yield break;
        }

        // 关键步骤:将初始化完成的Loader设置为管理器活跃Loader
        XRGeneralSettings.Instance.Manager.TrySetActiveLoader(m_SelectedXRLoader);

        // 等待一帧确保状态同步完成
        yield return null;

        if (XRGeneralSettings.Instance.Manager.activeLoader == null)
        {
            Debug.LogError("XR初始化失败,请检查Loader配置");
            m_SelectedXRLoader.Deinitialize();
            yield break;
        }

        Debug.Log("启动XR子系统");
        XRGeneralSettings.Instance.Manager.StartSubsystems();
    }

    /// <summary>
    /// 停止并卸载当前运行的XR实例
    /// </summary>
    public void StopXR()
    {
        if (m_SelectedXRLoader == null) return;

        XRGeneralSettings.Instance.Manager.StopSubsystems();
        XRGeneralSettings.Instance.Manager.DeinitializeLoader();
        m_SelectedXRLoader.Deinitialize();
        m_SelectedXRLoader = null;
    }
}

3. 配套配置要求

  • 打开XR Plugin Management设置,取消勾选 Initialize XR on Startup,避免启动时自动加载所有Loader
  • 确认Loader列表中ARCore、Cardboard的顺序固定,调用StartXR时传入对应索引即可
  • 跨场景切换XR模式时,先调用StopXR卸载当前Loader,再加载新场景并初始化对应Loader

4. ARFoundation场景适配补充

XR子系统启动完成后,等待1-2帧再启用ARSession,确保XRSessionSubsystem已完全加载,避免出现找不到子系统的警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:09:03