Unity 中的失跟
当设备无法在环境中定位自身时,应用会出现“跟踪丢失”的情况。 默认情况下,每当跟踪丢失时,Unity 将暂停更新循环并向用户显示一个启动图像。 重新获得跟踪后,启动图像将消失,更新循环将继续。
或者,用户可以通过选择退出设置来手动处理此转换。 如果不做任何处理,所有的内容在跟踪丢失期间都会变为身体锁定状态。
默认处理方式
默认情况下,在跟踪丢失期间,更新循环以及所有消息和事件都将停止。 同时,会向用户显示一个图像。 可以按下面的方法自定义此图像:选择“编辑”->“设置”->“播放器”,单击“启动图像”,并设置“全息跟踪丢失”图像。
手动处理方式
若要手动处理跟踪丢失,需要选择“编辑”>“项目设置”>“播放器”>“通用 Windows 平台”设置选项卡>“启动图像”>“Windows 全息版”,并取消选中“在跟踪丢失时暂停并显示图像”。 之后,你需要使用下面指定的 API 来处理跟踪更改。
命名空间:UnityEngine.XR.WSA
类型:WorldManager
- World Manager 公开一个事件来检测丢失/获取的跟踪 (WorldManager.OnPositionalLocatorStateChanged),还公开一个属性来查询当前状态 (WorldManager.state)
- 当跟踪状态不处于活动状态时,即使用户进行转换,相机也不会在虚拟环境中显示转换。 对象将不再对应于任何物理位置,并且所有对象都将显示身体已锁定。
当你自行处理跟踪更改时,需要轮询每个帧的状态属性,或处理 OnPositionalLocatorStateChanged 事件。
轮询
最重要的状态是 PositionalLocatorState.Active,表示跟踪功能完全正常。 任何其他状态都只会导致主相机的旋转增量。 例如:
void Update()
{
switch (UnityEngine.XR.WSA.WorldManager.state)
{
case PositionalLocatorState.Active:
// handle active
break;
case PositionalLocatorState.Activating:
case PositionalLocatorState.Inhibited:
case PositionalLocatorState.OrientationOnly:
case PositionalLocatorState.Unavailable:
default:
// only rotational information is available
break;
}
}
处理 OnPositionalLocatorStateChanged 事件
更方便的是,你也可以订阅 OnPositionalLocatorStateChanged 来处理转换:
void Start()
{
UnityEngine.XR.WSA.WorldManager.OnPositionalLocatorStateChanged += WorldManager_OnPositionalLocatorStateChanged;
}
private void WorldManager_OnPositionalLocatorStateChanged(PositionalLocatorState oldState, PositionalLocatorState newState)
{
if (newState == PositionalLocatorState.Active)
{
// Handle becoming active
}
else
{
// Handle becoming rotational only
}
}