Övervaka innehållsinläsning – MRTK2

Förlopp för scenåtgärd

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

Värdet SceneOperationProgress är genomsnittet av alla aktuella asynkrona scenåtgärder. I början av en innehållsinläsning SceneOperationProgress blir noll. När den är helt slutförd SceneOperationProgress ställs den in på 1 och förblir 1 tills nästa åtgärd äger rum. Observera att endast innehållsscenåtgärder 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 medan 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 innehåller flera åtgärder som meddelar dig när scener läses in eller tas bort. Varje åtgärd vidarebefordrar namnet på den berörda scenen.

Om en inläsnings- eller avlastningsåtgärd omfattar flera scener anropas relevanta åtgärder en gång per berörd scen. De anropas också samtidigt när belastnings- 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ört innehåll i efterhand.

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

Åtgärd När den anropas Innehållsscener Ljusscener Chefsscener
OnWillLoadContent Precis innan en innehållsscen läses in
OnContentLoaded När alla innehållsscener i en inläsningsåtgärd har lästs in helt och aktiverats
OnWillUnloadContent Precis före en lossningsåtgärd för innehållsscen
OnContentUnloaded När alla innehållsscener i en avlastningsåtgärd har tagits bort helt
OnWillLoadLighting Strax före en ljusscenbelastning
OnLightingLoaded Efter att en belysningsscen har lästs in och aktiverats fullt ut
OnWillUnloadLighting Precis innan en belysningsscen lossas
OnLightingUnloaded Efter att en belysningsscen har lossats helt
OnWillLoadScene Precis före en sceninläsning
OnSceneLoaded När alla scener i en åtgärd är helt inlästa och aktiverade
OnWillUnloadScene Precis innan en scen lossas
OnSceneUnloaded När en scen är helt urladdad

Åtgärdsexempel

Ett annat exempel på förloppsdialogruta som använder åtgärder och en coroutine 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ållsscener inställda på att aktiveras när de läses in. Om du vill styra scenaktivering manuellt kan du skicka en SceneActivationToken till valfri innehållsinläsningsmetod. Om flera innehållsscener läses in av en enda åtgärd gäller den här 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 tillhandahå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]);
}