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

