Unity での損失の追跡Tracking loss in Unity

デバイスが世界中で見つからない場合、アプリでは "損失の追跡" が発生します。When the device cannot locate itself in the world, the app experiences "tracking loss". 既定では、Unity は update ループを一時停止し、ユーザーにスプラッシュイメージを表示します。By default, Unity will pause the update loop and display a splash image to the user. 追跡が再開されると、スプラッシュイメージが消え、update ループが続行します。When tracking is regained, the splash image goes away and the update loop continues.

別の方法として、ユーザーは設定から除外することによって、この移行を手動で処理できます。As an alternative, the user can manually handle this transition by opting out of the setting. コンテンツを処理する処理が何も行われていない場合、追跡が失われても、すべてのコンテンツが本文でロックされているように見えます。All content will seem to become body locked during tracking loss if nothing is done to handle it.

既定の処理Default Handling

既定では、アプリの更新ループとすべてのメッセージとイベントは、追跡が失われている間停止します。By default, the update loop of the app as well as all messages and events will stop for the duration of tracking loss. 同時に、画像がユーザーに表示されます。At that same time, an image will be displayed to the user. このイメージをカスタマイズするには、[編集-> 設定-> プレーヤー] に移動し、[スプラッシュイメージ] をクリックして、Holographic Tracking ロスイメージを設定します。You can customize this image by going to Edit->Settings->Player, clicking Splash Image, and setting the Holographic Tracking Loss image.

手動処理Manual Handling

追跡の損失を手動で処理するには、 > [プロジェクト設定 > の編集 > ]、[設定] タブ > の [スプラッシュ画像] のユニバーサルWindowsプラットフォームに進む必要があります。 > Windows Holographicをオフにして、[トラックの損失を一時停止し、画像を表示する] をオフにします。To manually handle tracking loss, you need to go to Edit > Project Settings > Player > Universal Windows Platform settings tab > Splash Image > Windows Holographic and uncheck "On Tracking Loss Pause and Show Image". その後、以下で指定した Api を使用して、変更の追跡を処理する必要があります。After which, you need to handle tracking changes with the APIs specified below.

名前空間: UnityEngine.XR.WSANamespace: UnityEngine.XR.WSA
種類: WorldManagerType: WorldManager

  • World Manager は、紛失/獲得された追跡 (WorldManager OnPositionalLocatorStateChanged) を検出するイベントを公開し、プロパティを表示して現在の状態 (WorldManager) を照会します。World Manager exposes an event to detect tracking lost/gained (WorldManager.OnPositionalLocatorStateChanged) and a property to query the current state (WorldManager.state)
  • 追跡状態がアクティブでない場合、カメラは、ユーザーが変換した場合でも、仮想環境では変換されないように見えます。When the tracking state is not active, the camera will not appear to translate in the virtual world even as the user translates. これは、オブジェクトが物理的な場所に対応しなくなり、すべての本文がロックされることを意味します。This means objects will no longer correspond to any physical location and all will appear body locked.

変更の追跡を自分で処理する場合は、各フレームの状態プロパティをポーリングするか、 OnPositionalLocatorStateChangedイベントを処理する必要があります。When handling tracking changes on your own you either need to poll for the state property each frame or handle the OnPositionalLocatorStateChanged event.

ポーリングPolling

最も重要な状態はPositionallocatorstate です。アクティブとは、追跡が完全に機能していることを意味します。The most important state is PositionalLocatorState.Active which means tracking is fully functional. その他の状態では、メインカメラへの回転デルタのみが発生します。Any other state will result in only rotational deltas to the main camera. 以下に例を示します。For example:

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 イベントの処理Handling the OnPositionalLocatorStateChanged event

また、 OnPositionalLocatorStateChangedにサブスクライブして遷移を処理することもできます。Alternatively and more conveniently, you can also subscribe to OnPositionalLocatorStateChanged to handle the transitions:

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
    }
}

関連項目See also