Überwachen des Ladens von Inhalten – MRTK2

Status des Szenenvorgangs

Wenn Inhalte geladen oder geladen werden, gibt die SceneOperationInProgress Eigenschaft true zurück. Sie können den Fortschritt dieses Vorgangs über die SceneOperationProgress Eigenschaft überwachen.

Der SceneOperationProgress Wert ist der Mittelwert aller aktuellen asynchronen Szenenvorgänge. Am Anfang eines Inhaltsladevorgangs SceneOperationProgress ist null. Sobald vollständig abgeschlossen, SceneOperationProgress wird er auf 1 festgelegt und bleibt bis zum nächsten Vorgang bei 1. Beachten Sie, dass nur Inhaltsszenevorgänge diese Eigenschaften beeinflussen.

Diese Eigenschaften spiegeln den Zustand eines gesamten Vorgangs vom Anfang bis zum Ende wider, auch wenn dieser Vorgang mehrere Schritte enthält:

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)

Fortschrittsbeispiele

SceneOperationInProgress kann nützlich sein, wenn Aktivitäten angehalten werden sollen, während Inhalte geladen werden:

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 kann zum Anzeigen von Statusdialogfeldern verwendet werden:

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

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

Überwachung mit Aktionen

Das Szenensystem bietet mehrere Aktionen, um Ihnen mitzuteilen, wann Szenen geladen oder geladen werden. Jede Aktion gibt den Namen der betroffenen Szene weiter.

Wenn ein Lade- oder Entladevorgang mehrere Szenen umfasst, werden die relevanten Aktionen einmal pro betroffene Szene aufgerufen. Sie werden auch alle gleichzeitig aufgerufen, wenn der Lade- oder Entladevorgang vollständig abgeschlossen ist. Aus diesem Grund wird empfohlen, dass Sie OnWillUnload-Aktionen verwenden, um Inhalte zu erkennen, die zerstört werden, im Gegensatz zur Verwendung von OnUnload-Aktionen , um zerstörte Inhalte nach der Tatsache zu erkennen.

Auf der Anderen Seite, da OnLoaded-Aktionen nur aufgerufen werden, wenn alle Szenen aktiviert und vollständig geladen werden, verwenden Sie OnLoaded-Aktionen , um neue Inhalte zu erkennen und zu verwenden, ist sicher.

Aktion Wenn sie aufgerufen wird Inhaltsszenen Beleuchtungsszenen Managerszenen
OnWillLoadContent Vor dem Laden einer Inhaltsszene
OnContentLoaded Nachdem alle Inhaltsszenen in einem Ladevorgang vollständig geladen und aktiviert wurden
OnWillUnloadContent Vor dem Aufheben des Ladens einer Inhaltsszene
OnContentUnloaded Nachdem alle Inhaltsszenen in einem Unload-Vorgang vollständig geladen wurden
OnWillLoadLighting Vor dem Laden einer Beleuchtungsszene
OnLightingLoaded Nachdem eine Beleuchtungsszene vollständig geladen und aktiviert wurde
OnWillUnloadLighting Vor der Entladung einer Beleuchtungsszene
OnLightingUnloaded Nachdem eine Beleuchtungsszene vollständig geladen wurde
OnWillLoadScene Vor dem Laden einer Szene
OnSceneLoaded Nach allen Szenen in einem Vorgang werden voll geladen und aktiviert
OnWillUnloadScene Vor der Entladung einer Szene
OnSceneUnloaded Nachdem eine Szene vollständig geladen wurde

Aktionsbeispiele

Ein weiteres Statusdialogfeld mit Aktionen und einer Coroutine anstelle von Update:

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

    ...
}

Steuern der Szenenaktivierung

Standardmäßig werden Inhaltsszenen so festgelegt, dass sie aktiviert werden, wenn sie geladen werden. Wenn Sie die Szenenaktivierung manuell steuern möchten, können Sie eine SceneActivationToken an eine beliebige Inhaltslademethode übergeben. Wenn mehrere Inhaltsszenen von einem einzelnen Vorgang geladen werden, gilt dieses Aktivierungstoken für alle Szenen.

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

Überprüfen, welche Inhalte geladen werden

Die ContentSceneNames Eigenschaft bietet ein Array der verfügbaren Inhaltsszenen in der Reihenfolge des Buildindexes. Sie können überprüfen, ob diese Szenen über IsContentLoaded(string contentName)geladen werden.

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