Sdílet prostřednictvím


Ztráta sledování v Unity

Když zařízení nemůže najít na světě, aplikace zaznamená "ztrátu sledování". Unity ve výchozím nastavení pozastaví smyčku aktualizace a zobrazí uživateli úvodní obrázek, kdykoli dojde ke ztrátě sledování. Jakmile se sledování znovu obnoví, úvodní obrázek zmizí a smyčka aktualizace pokračuje.

Jako alternativu může uživatel tento přechod zpracovat ručně tím, že se z tohoto nastavení odhlásí. Veškerý obsah se při ztrátě sledování stane tělem uzamčeným, pokud se nic nestane, aby se s ním zachytálo.

Výchozí zpracování

Smyčka aktualizace a všechny zprávy a události se ve výchozím nastavení zastaví po dobu ztráty sledování. Zároveň se uživateli zobrazí obrázek. Tento obrázek můžete přizpůsobit tak, že přejdete na Edit-Settings-Player>>, kliknete na Úvodní obrázek a nastavíte holografický obrázek ztráty sledování.

Ruční manipulace

Pokud chcete ručně zpracovat ztrátu sledování, musíte přejít na upravit>přehrávač> nastavení>projektu Univerzální platforma Windows kartu>Úvodní obrázek>Windows Holographic a zrušit zaškrtnutí políčka Při sledování ztráty pozastavit a zobrazit obrázek. Potom je potřeba zpracovat sledování změn pomocí níže uvedených rozhraní API.

Obor názvů: UnityEngine.XR.WSA
Typ: WorldManager

  • World Manager zveřejňuje událost pro detekci ztráty a získání sledování (WorldManager.OnPositionalLocatorStateChanged) a vlastnost pro dotazování aktuálního stavu (WorldManager.state).
  • Pokud stav sledování není aktivní, kamera se nezobrazí, aby se přeložil ve virtuálním světě, i když uživatel překládá. Objekty už nebudou odpovídat žádnému fyzickému umístění a všechny se zobrazí jako uzamčené.

Při zpracování sledování změn sami, musíte buď dotazovat na stav vlastnost každý rámec nebo zpracovat OnPositionalLocatorStateChanged událost.

cyklické dotazování

Nejdůležitějším stavem je PositionalLocatorState.Active, což znamená, že sledování je plně funkční. Jakýkoli jiný stav bude mít za následek pouze rotační rozdíly s hlavní kamerou. Příklad:

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

Zpracování události OnPositionalLocatorStateChanged

Pohodlněji můžete také přihlásit k odběru OnPositionalLocatorStateChanged pro zpracování přechodů:

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

Viz také