Spåra förlust i Unity

När enheten inte kan hitta sig själv i världen upplever appen "spårningsförlust". Som standard pausar Unity uppdateringsloopen och visar en välkomstbild för användaren när spårningen går förlorad. När spårningen har återtagits försvinner välkomstbilden och uppdateringsloopen fortsätter.

Alternativt kan användaren hantera den här övergången manuellt genom att välja bort inställningen. Allt innehåll verkar bli kroppslåst under spårningsförlust om inget görs för att hantera det.

Standardhantering

Uppdateringsloopen och alla meddelanden och händelser stoppas under hela spårningsförlusten som standard. Samtidigt visas en bild för användaren. Du kan anpassa den här bilden genom att gå till Redigera inställningar-Spelare>>, klicka på Välkomstbild och ange holografisk spårningsförlustbild.

Manuell hantering

Om du vill hantera spårningsförlust manuellt måste du gå till Redigera>projektinställningar>player>Universell Windows-plattform inställningsflik>Splash Image>Windows Holographic och avmarkera "On Tracking Loss Pause and Show Image". Därefter måste du hantera spårningsändringar med de API:er som anges nedan.

Namnområde:UnityEngine.XR.WSA
Typ:WorldManager

  • World Manager exponerar en händelse för att identifiera spårning som förlorats/vunnits (WorldManager.OnPositionalLocatorStateChanged) och en egenskap för att fråga det aktuella tillståndet (WorldManager.state)
  • När spårningstillståndet inte är aktivt ser kameran inte ut att översättas i den virtuella världen även när användaren översätts. Objekt motsvarar inte längre någon fysisk plats och alla visas som låsta.

När du hanterar spårningsändringar på egen hand måste du antingen söka efter tillståndsegenskapen varje bildruta eller hantera händelsen OnPositionalLocatorStateChanged .

Avsökning

Det viktigaste tillståndet är PositionalLocatorState.Active, vilket innebär att spårningen är fullt fungerande. Alla andra tillstånd resulterar endast i rotationsdelta till huvudkameran. Exempel:

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

Hantera händelsen OnPositionalLocatorStateChanged

Mer praktiskt kan du även prenumerera på OnPositionalLocatorStateChanged för att hantera övergångarna:

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

Se även