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 låst under spårning av förlust om inget görs för att hantera det.

Standardhantering

Uppdateringsloopen och alla meddelanden och händelser stoppas som standard under spårningstiden. Samtidigt visas en bild för användaren. Du kan anpassa den här bilden genom att gå till Edit-Inställningar-Player>>, klicka på Välkomstbild och ange bilden Holographic Tracking Loss (Holographic Tracking Loss).

Manuell hantering

Om du vill> hantera spårningsförlust manuellt måste du gå till fliken Redigera>Project Inställningar>Inställningar> Universell Windows-plattform Snedstrecksbild>Windows Holographic och avmarkera "Pausa och visa bild vid spårning av förlust". Därefter måste du hantera spårning av ändringar med de API:er som anges nedan.

Namnrymd:UnityEngine.XR.WSA
Typ:WorldManager

  • World Manager exponerar en händelse för att identifiera spårning förlorade/skaffade (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ätta i den virtuella världen, inte ens när användaren översätter. Objekten 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 funktionell. Alla andra tillstånd resulterar i endast rotationsdeltor till huvudkameran. Till 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 onPositionalLocatorStateChanged-händelsen

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