Unity MARS场景切换后相机失效问题求助
解决Unity MARS场景切换后AR功能失效的问题
问题根源
场景切换时AR Session、XR Origin及MARS组件的状态未正确重置或清理,导致第二次进入AR场景时,残留的全局状态或未初始化的组件引发功能异常(平面/点云检测停止、背景变黑等)。
设置建议
- 组件生命周期管理:不要将AR Session、XR Origin或MARS Camera设置为
DontDestroyOnLoad,让这些组件随场景加载重建,避免跨场景状态残留。 - MARS Session配置:在MARS Session Settings中,确保「Auto Start Session」选项开启,或在场景加载时手动触发启动;同时关闭「Keep Session Across Scenes」(如果开启的话)。
- Camera冲突处理:场景1的Main Camera需在进入AR场景时禁用,返回菜单时重新启用,避免与MARS Camera的渲染冲突。
- AR背景设置:场景2、3中,确保XR Origin下的AR Background组件启用,且MARS Camera的「Clear Flags」设置为「AR Background」,解决黑色背景问题。
代码示例
AR场景初始化与清理脚本
挂载在场景2、3的XR Origin对象上,负责场景加载时重置AR状态,返回菜单时清理资源:
using UnityEngine; using UnityEngine.XR.ARFoundation; using UnityEngine.SceneManagement; using Unity.MARS; public class ARSceneHandler : MonoBehaviour { private ARSession _arSession; private MARSSession _marsSession; private ARPlaneManager _planeManager; private ARPointCloudManager _pointCloudManager; void Awake() { _arSession = GetComponentInChildren<ARSession>(); _marsSession = FindObjectOfType<MARSSession>(); _planeManager = GetComponentInChildren<ARPlaneManager>(); _pointCloudManager = GetComponentInChildren<ARPointCloudManager>(); } void OnEnable() { SceneManager.sceneLoaded += OnSceneLoaded; } void OnDisable() { SceneManager.sceneLoaded -= OnSceneLoaded; } // 场景加载完成后初始化AR组件 void OnSceneLoaded(Scene scene, LoadSceneMode mode) { // 重置并启动AR Session _arSession?.Reset(); _arSession.enabled = true; // 重置并启动MARS Session _marsSession?.ResetSession(); _marsSession?.StartSession(); // 启用平面和点云检测 _planeManager.enabled = true; _pointCloudManager.enabled = true; // 禁用场景1的Main Camera ToggleMenuCamera(false); } // 返回菜单时清理AR状态 public void BackToMenu() { // 停止AR和MARS Session _arSession.enabled = false; _marsSession?.StopSession(); // 销毁已检测到的平面和点云 ClearARTrackables(); // 启用场景1的Main Camera ToggleMenuCamera(true); SceneManager.LoadScene("Scene1"); } // 切换菜单Camera的启用状态 void ToggleMenuCamera(bool isEnabled) { foreach (var cam in FindObjectsOfType<Camera>()) { if (cam.name == "Main Camera" && cam.scene.name == "Scene1") { cam.enabled = isEnabled; break; } } } // 清理AR可跟踪对象 void ClearARTrackables() { if (_planeManager != null) { foreach (var plane in _planeManager.trackables) { Destroy(plane.gameObject); } _planeManager.enabled = false; } if (_pointCloudManager != null) { foreach (var cloud in _pointCloudManager.trackables) { Destroy(cloud.gameObject); } _pointCloudManager.enabled = false; } } }
按钮绑定说明
场景2、3的返回按钮,直接调用ARSceneHandler.BackToMenu()方法即可。
额外检查点
- 确认场景2、3中的XR Origin组件的「Camera」字段已正确绑定到MARS Camera。
- 检查MARS的「Image Tracking」组件,确保目标图像库已正确赋值,且「Auto Start Tracking」开启。
- 避免在场景1中存在任何AR相关的全局脚本或对象,防止干扰AR场景的初始化。
内容的提问来源于stack exchange,提问作者P D
相关产品推荐
相关产品推荐

