當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{// 處理即將進入狀態丟失時場景內容 } }
?