Het laden van inhoud bewaken — MRTK2

Voortgang van scènebewerking

Wanneer inhoud wordt geladen of gelost, retourneert de SceneOperationInProgress eigenschap true. U kunt de voortgang van deze bewerking controleren via de SceneOperationProgress eigenschap .

De SceneOperationProgress waarde is het gemiddelde van alle huidige asynchrone scènebewerkingen. Aan het begin van een inhoudsbelasting SceneOperationProgress is nul. Zodra alles is voltooid, SceneOperationProgress wordt ingesteld op 1 en blijft deze op 1 totdat de volgende bewerking wordt uitgevoerd. Houd er rekening mee dat alleen bewerkingen in de inhoudsscène van invloed zijn op deze eigenschappen.

Deze eigenschappen weerspiegelen de status van een hele bewerking van begin tot einde, zelfs als die bewerking meerdere stappen omvat:

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)

Voorbeelden van voortgang

SceneOperationInProgress kan nuttig zijn als de activiteit moet worden onderbroken terwijl inhoud wordt geladen:

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 worden gebruikt om voortgangsdialoogvensters weer te geven:

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

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

Bewaking met acties

Het Scènesysteem biedt verschillende acties om u te laten weten wanneer scènes worden geladen of verwijderd. Elke actie geeft de naam van de betrokken scène door.

Als een laad- of losbewerking meerdere scènes omvat, worden de relevante acties eenmaal per betrokken scène aangeroepen. Ze worden ook allemaal tegelijk aangeroepen wanneer de laad- of losbewerking volledig is voltooid. Daarom is het raadzaam om OnWillUnload-acties te gebruiken om inhoud te detecteren die wordt vernietigd, in plaats van OnUnloaded-acties te gebruiken om vernietigde inhoud achteraf te detecteren.

Aan de andere kant, omdat OnLoaded-acties alleen worden aangeroepen wanneer alle scènes zijn geactiveerd en volledig zijn geladen, is het gebruik van OnLoaded-acties voor het detecteren en gebruiken van nieuwe inhoud gegarandeerd veilig.

Actie Wanneer deze wordt aangeroepen Inhoudsscènes Lichtscènes Managerscènes
OnWillLoadContent Vlak vóór het laden van een inhoudsscène
OnContentLoaded Nadat alle inhoudsscènes in een laadbewerking volledig zijn geladen en geactiveerd
OnWillUnloadContent Vlak voor het uitladen van een inhoudsscène
OnContentUnloaded Nadat alle inhoudsscènes in een uitlaadbewerking volledig zijn uitgeladen
OnWillLoadLighting Vlak voor het laden van een lichtscène
OnLightingLoaded Nadat een lichtscène volledig is geladen en geactiveerd
OnWillUnloadLighting Vlak voordat een lichtscène wordt geladen
OnLightingUnloaded Nadat een lichtscène volledig is gelost
OnWillLoadScene Vlak voordat een scène wordt geladen
OnSceneLoaded Nadat alle scènes in een bewerking volledig zijn geladen en geactiveerd
OnWillUnloadScene Vlak voordat een scène wordt uitgeladen
OnSceneUnloaded Nadat een scène volledig is uitgeladen

Voorbeelden van acties

Een ander voorbeeld van een voortgangsdialoogvenster met acties en een coroutine in plaats van Bijwerken:

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

    ...
}

Activering van scènes beheren

Standaard worden inhoudscènes zo ingesteld dat ze worden geactiveerd wanneer ze worden geladen. Als u de activering van scènes handmatig wilt beheren, kunt u een SceneActivationToken doorgeven aan elke laadmethode voor inhoud. Als er meerdere inhoudsscènes worden geladen door één bewerking, is dit activeringstoken van toepassing op alle scènes.

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

Controleren welke inhoud wordt geladen

De ContentSceneNames eigenschap biedt een matrix van beschikbare inhoudsscènes in volgorde van build-index. U kunt controleren of deze scènes zijn geladen 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]);
}