Unity での損失の追跡
デバイスが自身を現実世界で見つけられない場合は、アプリで "追跡損失" が発生します。 既定では、Unity が更新ループを一時停止して、追跡が失われたときユーザーにスプラッシュ画像を表示します。 追跡が回復すると、スプラッシュ画像が消え、更新ループは継続します。
別の方法として、ユーザーは、設定をオプトアウトすることで、この切り替えを手動で処理できます。 処理が何も行われなかった場合、すべてのコンテンツが追跡損失中にボディーロックされているように見えます。
既定の処理
更新ループとすべてのメッセージおよびイベントは、既定で追跡損失の間停止します。 同時に、画像がユーザーに表示されます。 この画像をカスタマイズするには、[編集] -> [設定] -> [プレイヤー] に移動し、[Splash Image]\(スプラッシュ画像\) をクリックして、ホログラフィック追跡損失画像を設定します。
手動処理
追跡損失を手動で処理するには、[編集] > [プロジェクト設定] > [プレイヤー] > [Universal Windows Platform settings]\(ユニバーサル Windows プラットフォームの設定\) タブ > [Splash Image]\(スプラッシュ画像\) > [Windows Holographic] に移動し、[On Tracking Loss Pause and Show Image]\(追跡損失時の一時停止と画像の表示\) をオフにします。 その後、以下に指定された API を使用して、追跡の変更を処理する必要があります。
Namespace: UnityEngine.XR.WSA
Type: 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
}
}