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
    }
}

另请参阅