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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:27:39