保留空间坐标系

一般而言,World Locking Tools 的持久性功能的优势比实现的详细情况更值得关注。

因此,本文首先讨论 World Locking Tools 持久性所支持的体验。 然后我们将了解如何管理 World Locking Tools 状态持久性。 接着我们将对保存和加载的数据进行简要介绍。

跨会话 World Locking Tools

正如其他地方所定义的,冻结状态是恢复当前世界锁定稳定空间所需的全部数据。

World Locking Tools 持久性的主要功用是允许在后续会话中借助初步会话工作的成果,即扫描区域以及使虚拟空间与现实世界保持一致。

还原此状态,能让后续会话无需完成繁琐或耗时的设置,直奔主题。

保存 World Locking Tools 状态

必须先保存冻结状态,然后才能进行加载。

要保存冻结状态,最直接方法是在 World Locking Tools 上下文的 Unity 检查器中或通过脚本在运行时启用 World Locking Tools Manager 上的自动保存。

通过脚本设置 World Locking Tools Manager 状态的方法是:首先获取状态,按自己的需求更改状态,然后以块的形式将状态设置回去。 例如开关自动保存功能:

var settings = WorldLockingManger.GetInstance().Settings;
settings.AutoSave = !settings.AutoSave;
WorldLockingManager.GetInstance().Settings = settings;

如果自动保存功能在会话期间从“启用”状态转为“禁用”状态,则系统不会再尝试进一步的定期保存。 如果从“禁用”状态转为“启用”状态,将开始或恢复定期保存。

自动保存功能通过定期异步保存当前状态来保持最新保存的状态。

如果需要对保存状态的时间进行更多控制,可将自动保存设置为 false,并且可以通过脚本进行手动保存。 异步保存很容易触发,如下所示:

WorldLockingManager.GetInstance().Save();

由于保存是异步的,因此在之前的保存仍在进行时,其他调用 Save() 的尝试将被忽略。

加载冻结状态

保存冻结状态后,可能需要将 World Locking Tools 重新加载回该状态(不管是在后续会话中,还是之后在同一会话中)。

正如我们在保存冻结状态时发现的情况一样,加载状态也有两种路径。

如果在 World Locking Tools Manager 上启用了自动加载标志,则启动时将加载以前保存的任何状态。 如果没有要加载的已保存状态,则不生成任何错误,并且启动将继续,就像未设置标志一样。

在运行时将自动加载标志从 false 设置为 true(例如通过脚本设置)将不起作用。 自动加载只会在初始加载时发生。

不过可以通过 World Locking Tools Manager 的 Load 函数随时从脚本启动加载:

WorldLockingManager.GetInstance().Load();

与保存一样,加载以异步方式执行。 当一个调用仍在进行时,将忽略对 Load 的所有后续调用。

保存了哪些数据?

重新构造 World Locking Tools 映射(即校准虚拟世界与现实世界)所需的数据可以分为四组。

  • 空间定位点:World Locking Tools 的定位点管理器在内部创建和维护的空间定位点的基础网络,实现与现实世界的必要绑定。 这些定位点通过平台的基础存储机制持久保存。

  • 引擎状态:保留引擎状态,让引擎能恢复其当前映射。 还原此状态可以消除一些不确定性,比如前面的会话开头的初始姿态。

  • 空间固定:如果应用程序已应用任何进一步的空间大头针在一组离散点强制校准建模坐标和真实世界,则也会保留该映射。

  • 坐标空间:World Locking Tools 通过保存局部空间定位点的内部图来保留相对于物理世界的坐标空间。

未保存哪些数据?

设置不会保存,并且 World Locking Tools 不会保存或还原单个应用程序对象。 仅保存状态。 应用程序更改的任何配置(例如,通过 WorldLockingManager API 所做的更改)将在每次应用程序启动时重置为 Unity 检查器中设置的值。 或者,如果未在检查器中设置这些值,则会设置为代码中的默认值。

例如,假设应用程序希望向用户显示自动保存世界锁定状态选项,并要在不同会话间保留用户的首选项,直到它们被更改为止。 那么应用程序必须:

  1. 向用户显示用于设置自动保存首选项(可能还有其他应用程序设置)的 UX。
  2. 将用户的首选项转发到 WorldLockingManager。
  3. 将首选项记录到文件(可能包括其他应用程序设置)。
  4. 在应用程序启动时,加载保存的首选项(如果有),并将其转发到 WorldLockingManager。

请参阅 WorldLockingContext 中的说明,了解在资源和脚本之间混合状态设置时出现的时间问题。

另请参阅