目前HoloLens上几款游戏的做法,主要将现实中的地面与墙面引入游戏之中。现实房间中的地板天然地成为游戏的地面,墙壁则更多地用来当作障碍。当HoloLens设备不能识别到自己在世界中的位置时,应用就会发生tracking loss。默认情况下,Unity会暂停Update更新循环并显示一张闪屏图片给用户。当设备重新能追踪到位置时,闪屏图片会消失,并且Update循环还会继续。

此外,用户也可以手动处理这个切换过程。发生tracking loss期间,如果不做任何处理动作,那么所有的场景中的全息内容将会处于body-locked状态。

默认处理方式 Default Handling


默认情况下,发生tracking loss期间应用所有的更新动作、事件和消息都会被暂停。同时会应用会显示一张图片给用户。可以用通过项目设置Player settings-> Splash Image->Holographic Tracking Loss image选项来设置tracking loss要显示的图片。

 

泰课在线

 

手动处理 Manual Handling


为了手动处理tracking loss, 你需要在上面提到的设置选项上取消勾选“Display tracking loss image”选项。之后就需要使用下面特定的API来处理追踪状态变化。

命名空间UnityEngine.VR.WSA

类型WorldManager

  • World Manager提供了一个事件(WorldManager.OnPositionalLocatorStateChanged)来让我们识别追踪状态(追踪丢失/追踪可获取到),同时还提供了一个属性来查询当前追踪状态(WorldManager.state)
  • 当追踪状态丢失时,场景中相机将立刻静止,不会再移动,即使用户在运动。这意味全息图形将不再响应用户的物理位置的变化,所有内容都会相对用户身体静止

在手动处理追踪状态变化时,你需要每一帧都查询当前追踪状态,或者处理OnPositionalLocatorStateChanged事件。

轮询 Polling

追踪状态最重要的一个状态是PositionalLocatorState.Active,这意味着当前HoloLens的状态追踪正常工作。任何其他的状态都会导致摄像机只剩下旋转增量,而忽略位置变化。

例如:

void Update()
{
    switch (UnityEngine.VR.WSA.WorldManager.state)
    {
        case PositionalLocatorState.Active:
            //处理激活状态内容
            break;
        case PositionalLocatorState.Activating:
        case PositionalLocatorState.Inhibited:
        case PositionalLocatorState.OrientationOnly:
        case PositionalLocatorState.Unavailable:
        default:
            // 摄像机当前只有旋转增量变化
            break;
    }
}

处理追踪状态变化事件 Handling the OnPositionalLocatorStateChanged event

 此外更便利的方法是订阅状态追踪的OnPositionalLocatorStateChanged事件来处理:

void Start()
{
    UnityEngine.VR.WSA.WorldManager.OnPositionalLocatorStateChanged += WorldManager_OnPositionalLocatorStateChanged;
}

private void WorldManager_OnPositionalLocatorStateChanged(PositionalLocatorState oldState, PositionalLocatorState newState)
{
    if (newState == PositionalLocatorState.Active)
    {
        // 处理即将进入追踪恢复时场景内容
    }
    else
    {
        // 处理即将进入状态丢失时场景内容
    }
}