Unity での損失の追跡

デバイスが自身を現実世界で見つけられない場合は、アプリで "追跡損失" が発生します。 既定では、Unity が更新ループを一時停止して、追跡が失われたときユーザーにスプラッシュ画像を表示します。 追跡が回復すると、スプラッシュ画像が消え、更新ループは継続します。

別の方法として、ユーザーは、設定をオプトアウトすることで、この切り替えを手動で処理できます。 処理が何も行われなかった場合、すべてのコンテンツが追跡損失中にボディーロックされているように見えます。

既定の処理

更新ループとすべてのメッセージおよびイベントは、既定で追跡損失の間停止します。 同時に、画像がユーザーに表示されます。 この画像をカスタマイズするには、[編集] -> [設定] -> [プレイヤー] に移動し、[Splash Image](スプラッシュ画像) をクリックして、ホログラフィック追跡損失画像を設定します。

手動処理

追跡損失を手動で処理するには、[編集]>[プロジェクト設定]>[プレイヤー]>[Universal Windows Platform settings](ユニバーサル Windows プラットフォームの設定) タブ>[Splash Image](スプラッシュ画像)>[Windows Holographic] に移動し、[On Tracking Loss Pause and Show Image](追跡損失時の一時停止と画像の表示) をオフにします。 その後、以下に指定された 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
    }
}

関連項目