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

ARKit切换基于Marker的场景时应用崩溃,寻求解决方案

解决ARKit切换Marker场景时的SIGABRT崩溃问题

我之前也碰到过类似的ARKit场景切换崩溃问题,结合你提到的无标记场景解决方案,给你适配Marker场景的重置方案:

问题根源

切换基于Marker(ImageAnchor)的场景时,旧ARSession中的ImageAnchor资源和配置没有被彻底清理,新场景初始化时会和旧资源产生冲突,最终触发SIGABRT错误。你之前的ResetScene方法针对的是无标记的WorldTracking配置,而Marker场景需要用ImageTracking配置来重置,逻辑上要做针对性调整。

解决方案步骤

  1. 切换场景前停止当前ARSession并清理资源
  2. 加载新Marker场景后,重新初始化ImageTracking配置

第一步:封装停止Session的方法

在切换场景前调用这个方法,确保旧Session的资源被彻底清理:

public void StopARSession()
{
    var sessionInterface = UnityARSessionNativeInterface.GetARSessionNativeInterface();
    if (sessionInterface.IsRunning)
    {
        // 暂停Session
        sessionInterface.Pause();
        // 移除所有锚点(包括ImageAnchor)
        sessionInterface.RemoveAllAnchors();
        // 可选:取消所有AR相关的回调注册,避免内存泄漏
        // UnityARSessionNativeInterface.ARFrameUpdatedEvent -= YourFrameUpdateCallback;
    }
}

第二步:修改场景切换逻辑

先停止Session再加载场景,避免新旧Session冲突:

// 满足切换条件时执行
if (switchToMarkerScene)
{
    StopARSession();
    SceneManager.LoadScene("Marker", LoadSceneMode.Single);
}

第三步:在Marker场景中初始化ImageTracking配置

在Marker场景的入口脚本(比如MarkerSceneInitializer.cs)中,添加初始化逻辑:

void Start()
{
    InitializeMarkerTrackingSession();
}

public void InitializeMarkerTrackingSession()
{
    // 创建ImageTracking配置实例
    ARKitImageTrackingSessionConfiguration imageConfig = new ARKitImageTrackingSessionConfiguration();
    
    // 绑定你在Unity中配置的Reference Images Library
    // 注意替换成你自己的图集名称
    imageConfig.trackingImages = UnityARReferenceImagesLibrary.FromReferenceImagesLibrary("YourMarkerReferenceLibrary");
    
    // 启动Session并带上重置选项,确保完全重置追踪状态
    UnityARSessionNativeInterface.GetARSessionNativeInterface().RunWithConfigAndOptions(
        imageConfig,
        UnityARSessionRunOption.ARSessionRunOptionRemoveExistingAnchors | UnityARSessionRunOption.ARSessionRunOptionResetTracking
    );
}

额外注意事项

  • 确保你的Reference Images Library在Unity中配置正确,图片尺寸、物理大小都符合ARKit要求
  • 如果场景中有订阅AR相关的事件(比如ARFrameUpdatedEvent),切换前一定要取消注册,避免内存泄漏导致的崩溃
  • 可以在Xcode中查看崩溃的详细调用栈,确认是否是锚点重复或者配置冲突的问题,方便进一步排查

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:17:35