Unity+Azure空间锚点问题:SpatialAnchorManager为何突然消失?
Azure空间锚点场景切换异常问题排查
问题描述
我正在Unity中基于微软Azure空间锚点教程开发Hololens 2应用,技术栈包含Unity、Mixed Reality Toolkit和OpenXR。设置了两个功能场景:
- 「编辑模式」场景:用于放置空间锚点
- 「预览模式」场景:用于查看已放置的锚点
每个场景都有脚本支持按钮点击切换场景,且两个场景中SpatialAnchorManager组件都与切换脚本挂载在同一个游戏对象上,通过以下代码获取组件:
private SpatialAnchorManager anchorManager; void Start() { anchorManager = GetComponent<SpatialAnchorManager>(); }
从编辑模式切换到预览模式时一切正常,切换代码如下:
public void moveToPreview() { if(anchorManager.IsSessionStarted) { anchorManager.DestroySession(); } SceneManager.LoadScene("PreviewScene"); }
但从预览模式切回编辑模式时,会抛出异常提示找不到SpatialAnchorManager,切换代码如下:
public void moveToEdit() { if(anchorManager == null) { throw new Exception("Somehow the manager is not here."); } if(anchorManager.IsSessionStarted) { anchorManager.DestroySession(); } SceneManager.LoadScene("EditScene"); }
使用版本:Unity 2021.3.4f1,Azure Spatial Anchors SDK v2.13.0。
问题原因分析
Start方法执行时机滞后:预览场景内的切换脚本依赖Start方法初始化anchorManager,但如果触发moveToEdit的按钮点击事件发生在Start执行之前(比如场景加载后快速点击按钮,或者脚本执行顺序设置不合理),此时anchorManager还未完成赋值,就会触发null异常。而编辑模式切换正常,是因为编辑场景加载后Start已执行完成,anchorManager已正确初始化。- 场景切换的对象生命周期逻辑:从预览场景切回编辑场景时,预览场景的所有游戏对象会被销毁,编辑场景的对象是重新实例化的。如果预览场景的切换脚本没有在合适的时机完成组件获取,就会导致
anchorManager为null。 - 脚本执行顺序配置错误:如果切换脚本的
Start方法执行顺序晚于按钮事件的触发逻辑,也会出现anchorManager未初始化就被调用的情况。
内容的提问来源于stack exchange,提问作者Haley C
相关产品推荐
相关产品推荐

