目前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
{
// 处理即将进入状态丢失时场景内容
}
}