Övervaka innehållsläsning

Förlopp för scenåtgärd

När innehåll läses in eller tas bort returnerar SceneOperationInProgress egenskapen true. Du kan övervaka förloppet för den här åtgärden via SceneOperationProgress egenskapen .

Värdet SceneOperationProgress är medelvärdet av alla aktuella asynkrona scenåtgärder. I början av en innehållsbelastning är SceneOperationProgress noll. När det är klart SceneOperationProgress anges till 1 och förblir vid 1 tills nästa åtgärd äger rum. Observera att endast åtgärder för innehållsscener påverkar dessa egenskaper.

Dessa egenskaper återspeglar tillståndet för en hel åtgärd från början till slut, även om åtgärden innehåller flera steg:

IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();

// First do an additive scene load
// SceneOperationInProgress will be true for the duration of this operation
// SceneOperationProgress will show 0-1 as it completes
await sceneSystem.LoadContent("ContentScene1");

// Now do a single scene load
// This will result in two actions back-to-back
// First "ContentScene1" will be unloaded
// Then "ContentScene2" will be loaded
// SceneOperationInProgress will be true for the duration of this operation
// SceneOperationProgress will show 0-1 as it completes
sceneSystem.LoadContent("ContentScene2", LoadSceneMode.Single)

Förloppsexempel

SceneOperationInProgress kan vara användbart om aktiviteten ska pausas när innehållet läses in:

public class FooManager : MonoBehaviour
{
    private void Update()
    {
        IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();

        // Don't update foos while a scene operation is in progress
        if (sceneSystem.SceneOperationInProgress)
        {
            return;
        }

        // Update foos
        ...
    }
    ...
}

SceneOperationProgress kan användas för att visa förloppsdialogrutor:

public class ProgressDialog : MonoBehaviour
{
    private void Update()
    {
        IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();

        if (sceneSystem.SceneOperationInProgress)
        {
            DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
        }
        else
        {
            HideProgressIndicator();
        }
    }
    ...
}

Övervakning med åtgärder

Scensystemet tillhandahåller flera åtgärder som låter dig veta när scener läses in eller tas bort. Varje åtgärd vidarebefordrar namnet på den berörda scenen.

Om en belastnings- eller avlastningsåtgärd omfattar flera scener, anropas relevanta åtgärder en gång per berörd scen. De anropas också samtidigt när inläsnings- eller avlastningsåtgärden är helt slutförd. Därför rekommenderar vi att du använder onWillUnload-åtgärder för att identifiera innehåll som kommer att förstöras, i stället för att använda OnUnloaded-åtgärder för att identifiera förstöret innehåll i efterhand.

Å andra sidan är det garanterat säkert att använda OnLoaded-åtgärder för att identifiera och använda nytt innehåll eftersom onloaded-åtgärder endast anropas när alla scener aktiveras och läses in fullständigt.

Åtgärd När den anropas Innehållsscener Belysningsscener Chefsscenerier
OnWillLoadContent Precis före en innehållsscenbelastning
OnContentLoaded När alla innehållsscener i en inläsningsåtgärd har lästs in och aktiverats fullständigt
OnWillUnloadContent Precis före en avlastningsåtgärd för en innehållsscen
OnContentUnloaded När alla innehållsscener i en avlastningsåtgärd har tagits bort helt
OnWillLoadLighting Precis före en belysningsscenbelastning
OnLightingLoaded När en belysningsscen har lästs in helt och aktiverats
OnWillUnloadLighting Precis innan en belysningsscen tas bort
OnLightingUnloaded När en belysningsscen har tagits bort helt
OnWillLoadScene Precis före en scenbelastning
OnSceneLoaded När alla scener i en åtgärd är helt inlästa och aktiverade
OnWillUnloadScene Precis före en scenavlastning
OnSceneUnloaded När en scen är helt bortladdad

Åtgärdsexempel

Ett annat förloppsdialogexempel med åtgärder och en koroutine i stället för Uppdatera:

public class ProgressDialog : MonoBehaviour
{
    private bool displayingProgress = false;

    private void Start()
    {
        IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
        sceneSystem.OnWillLoadContent += HandleSceneOperation;
        sceneSystem.OnWillUnloadContent += HandleSceneOperation;
    }

    private void HandleSceneOperation (string sceneName)
    {
        // This may be invoked multiple times per frame - once per scene being loaded or unloaded.
        // So filter the events appropriately.
        if (displayingProgress)
        {
            return;
        }

        displayingProgress = true;
        StartCoroutine(DisplayProgress());
    }

    private IEnumerator DisplayProgress()
    {
        IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();

        while (sceneSystem.SceneOperationInProgress)
        {
            DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
            yield return null;
        }

        HideProgressIndicator();
        displayingProgress = false;
    }

    ...
}

Kontrollera scenaktivering

Som standard är innehållsscenarier inställda på att aktiveras när de läses in. Om du vill kontrollera scenaktiveringen manuellt kan du skicka en till valfri SceneActivationToken metod för innehållsbelastning. Om flera innehållsscener läses in av en enda åtgärd gäller denna aktiveringstoken för alla scener.

IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();

SceneActivationToken activationToken = new SceneActivationToken();

// Load the content and pass the activation token
sceneSystem.LoadContent(new string[] { "ContentScene1", "ContentScene2", "ContentScene3" }, LoadSceneMode.Additive, activationToken);

// Wait until all users have joined the experience
while (!AllUsersHaveJoinedExperience())
{
    await Task.Yield();
}

// Let scene system know we're ready to activate all scenes
activationToken.AllowSceneActivation = true;

// Wait for all scenes to be fully loaded and activated
while (sceneSystem.SceneOperationInProgress)
{
    await Task.Yield();
}

// Proceed with experience

Kontrollera vilket innehåll som läses in

Egenskapen ContentSceneNames innehåller en matris med tillgängliga innehållsscener i ordning efter byggindex. Du kan kontrollera om dessa scener läses in via IsContentLoaded(string contentName).

IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();

string[] contentSceneNames = sceneSystem.ContentSceneNames;
bool[] loadStatus = new bool[contentSceneNames.Length];

for (int i = 0; i < contentSceneNames.Length; i++>)
{
    loadStatus[i] = sceneSystem.IsContentLoaded(contentSceneNames[i]);
}