HoloLens2+MRTK3适配版World Locking Tools对象位置跨会话持久化异常
问题排查与解决方案
针对你在HoloLens 2 + MRTK3 + 适配版World Locking Tools(WLT)中遇到的完全关闭应用/重启设备后场景对象位置重置问题,从以下几个方向逐一排查:
1. 确认应用存储权限与WLT保存路径
- 检查Package.appxmanifest的权限配置:在
Capabilities中勾选FileSystem,并将权限级别设置为local(若需要更宽范围可选择broadFileSystemAccess,但需在设备设置中额外授权)。WLT的持久化数据需要写入HoloLens的应用私有存储目录,权限不足会直接导致保存失败。 - 核对WLT Context的
Save Path:确保路径是基于Application.persistentDataPath的相对路径,避免使用绝对路径(HoloLens对绝对路径访问有严格限制)。默认路径无需修改,也可手动指定为PersistentDataPath/WorldLocking这类明确的相对路径。
2. 修正手动保存的调用逻辑
- 确保保存时机正确:必须等待
WorldLockingManager.Instance.IsReady返回true后再调用保存接口——如果在空间锚点未稳定时保存,写入的是未校准的初始状态,重启后自然会重置。 - 布置完成后添加
Refreeze步骤:在调用Save()前,先执行WorldLockingManager.Instance.Refreeze(),让WLT重新计算并锁定当前场景对象与空间锚点的关联关系,再保存冻结后的状态。调整后的示例代码如下:public void SaveWorldLockingState() { if (WorldLockingManager.Instance.IsReady) { WorldLockingManager.Instance.Refreeze(); WorldLockingManager.Instance.Save(); Debug.Log("WLT状态已保存"); } else { Debug.LogError("WLT未初始化完成,无法保存"); } }
3. 检查场景对象的WLT组件配置
- 所有需要持久化位置的对象必须挂载
WorldLockingObject组件:确保组件的Attachment Point Mode设置为FixedToWorld(针对布置后固定的对象),并关联到场景中的WorldLockingContext。 - 避免初始位置与锚点冲突:编辑模式下将对象放在HoloLens启动时的初始视角附近,再进行布置调整——如果对象初始位置离WLT初始化的空间锚点过远,重启后可能无法正确匹配锚点数据。
4. 验证WLT分支版本的兼容性
- 查看该适配MRTK3分支的提交记录与Issue:非官方分支可能存在持久化逻辑bug,比如保存时未完整写入锚点关联数据,或启动时未正确读取保存的状态。可以尝试拉取分支最新代码,或在分支的Issue区搜索类似问题。
- 手动验证保存加载流程:保存后立即调用
WorldLockingManager.Instance.Load(),如果加载后对象位置正确,说明保存逻辑正常,问题出在重启后的自动加载环节;如果加载失败,说明保存过程本身存在问题。
5. 设备端存储验证
- 通过HoloLens设备门户查看应用私有存储:进入
文件资源管理器,找到应用的LocalState目录(路径一般为LocalAppData\你的应用包名\LocalState),检查是否存在WLT的保存文件(通常命名为WorldLockingState相关文件)。- 若无保存文件:说明保存逻辑未执行或权限不足,回到第一步排查。
- 若有保存文件但重启后未加载:检查WLT Context的
Auto Load是否勾选,确保应用启动时自动加载保存的状态。
内容的提问来源于stack exchange,提问作者Ben Brown
相关产品推荐
相关产品推荐

