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

Azure Spatial Anchors初始化CloudSpatialAnchorSession异常求助

Azure Spatial Anchors单会话方案合理性及初始化错误排查

一、单会话管理多锚点方案的合理性

这个方案完全合理。Azure Spatial Anchors的CloudSpatialAnchorSession本身就被设计为可以统一管理多个云锚点的创建、查询、定位与生命周期,将会话实例挂载到全局唯一的AzureManager游戏对象上:

  • 避免重复创建会话导致的资源浪费与冲突;
  • 便于统一控制会话的启动、暂停、销毁流程;
  • 符合Azure Spatial Anchors官方推荐的单实例会话最佳实践。

二、初始化错误的排查与修复

你遇到的AzureSpatialAnchors assembly:<unknown assembly> type:<unknown type> member:(null)错误,本质是程序集加载失败或XR环境配置缺失,结合代码问题,按以下步骤解决:

1. 检查依赖与配置

  • 确认Unity Package Manager中已安装兼容版本的Azure Spatial Anchors包和Mixed Reality OpenXR Plugin,包版本需匹配项目Unity版本(比如Unity 2022对应ASA包2.10+);
  • 检查项目Plugins目录下是否存在Microsoft.Azure.SpatialAnchors.dll、Microsoft.Azure.SpatialAnchors.Unity.dll等核心库,无缺失或损坏;
  • 在Project Settings > XR Plug-in Management中:
    • 启用OpenXR;
    • 添加Microsoft Mixed Reality OpenXR Feature并确保Spatial Anchors功能已勾选;
    • 针对目标平台(如Windows MR)开启空间感知与网络权限。

2. 代码修正要点

以下是修复后的完整代码,解决了会话初始化的核心问题:

using Microsoft.Azure.SpatialAnchors;
using Microsoft.Azure.SpatialAnchors.Unity;
using Microsoft.MixedReality.OpenXR;
using System;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.XR.OpenXR;

public class AnchorsManager : MonoBehaviour
{
    private GameObject localAnchor;
    private string AccountId = "00886172-b4....";
    private string AccountKey = "xmQmM5zD3HNDZB0RAl6PsnSDVdm2l+.....";
    private string AccountDomain = "northeurope.mixedreality.azure.com";
    private CloudSpatialAnchorSession cloudSession;

    void Start()
    {
        InitializeSession();
    }

    public async void OnMouseDown(GameObject localAnchor)
    {
        this.localAnchor = localAnchor;
        if (cloudSession != null)
        {
            try
            {
                await cloudSession.StartAsync();
            }
            catch (Exception ex)
            {
                Debug.LogError("Failed to start session: " + ex.Message);
            }
        }
    }

    void InitializeSession()
    {
        try
        {
            cloudSession = new CloudSpatialAnchorSession();
            // 关联OpenXR会话,这是初始化的关键步骤
            cloudSession.Session = OpenXRSessionExtensions.GetCurrentOpenXRSession();

            // 配置Azure账号信息
            cloudSession.Configuration.AccountId = AccountId;
            cloudSession.Configuration.AccountKey = AccountKey;
            cloudSession.Configuration.AccountDomain = AccountDomain;

            // 订阅会话更新与错误事件
            cloudSession.SessionUpdated += OnSessionUpdated;
            cloudSession.ErrorOccurred += OnSessionError;
        }
        catch (Exception ex)
        {
            Debug.LogError("Error on initialize the session: " + ex.Message + "\n" + ex.StackTrace);
        }
    }

    private void OnSessionUpdated(object sender, SessionUpdatedEventArgs args)
    {
        if (args.Status.RecommendedForCreateProgress > 0.9f) // 建议进度达标再创建锚点
        {
            // 此处调用锚点创建逻辑
        }
    }

    private void OnSessionError(object sender, SessionErrorEventArgs args)
    {
        Debug.LogError($"Session error: {args.ErrorMessage}, code: {args.ErrorCode}");
    }

    // 生命周期管理:销毁会话释放资源
    private void OnDestroy()
    {
        if (cloudSession != null)
        {
            cloudSession.Stop();
            cloudSession.Dispose();
            cloudSession = null;
        }
    }
}

关键修复点说明

  • 添加了cloudSession.Session = OpenXRSessionExtensions.GetCurrentOpenXRSession();:必须将ASA会话与当前XR会话绑定,否则会出现程序集加载错误;
  • 将cloudSession.Start()改为异步的await cloudSession.StartAsync():会话启动是异步操作,同步调用会导致未定义行为;
  • 新增ErrorOccurred事件订阅:获取更详细的错误代码与信息,便于精准排查;
  • 添加OnDestroy生命周期方法:销毁时释放会话资源,避免内存泄漏;
  • 修正了方法名拼写onMouseDown→OnMouseDown(Unity消息回调规范,首字母大写)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:40:27