Überwachen des Ladens von Inhalten – MRTK2

Szenenvorgangsstatus

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

Der SceneOperationProgress Wert ist der Durchschnitt aller aktuellen asynchronen Szenenvorgänge. Am Anfang eines Inhaltsladevorgangs SceneOperationProgress ist null. Nach vollständiger Ausführung SceneOperationProgress wird auf 1 festgelegt und bleibt bei 1, bis der nächste Vorgang durchgeführt wird. Beachten Sie, dass sich nur Inhaltsszenevorgänge auf diese Eigenschaften auswirken.

Diese Eigenschaften spiegeln den Status eines gesamten Vorgangs von Anfang bis Ende wider, auch wenn dieser Vorgang mehrere Schritte umfasst:

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 die Aktivität während des Ladens von Inhalten angehalten werden soll:

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 verwendet werden, um Statusdialoge anzuzeigen:

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 Sie darüber zu informieren, wann Szenen geladen oder entladen werden. Jede Aktion gibt den Namen der betroffenen Szene weiter.

Wenn ein Lade- oder Entladevorgang mehrere Szenen umfasst, werden die relevanten Aktionen einmal pro betroffener 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 zerstörte Inhalte zu erkennen, anstatt OnUnloaded-Aktionen zu verwenden, 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 sind, ist die Verwendung von OnLoaded-Aktionen zum Erkennen und Verwenden neuer Inhalte garantiert sicher.

Action Wenn sie aufgerufen wird Inhaltsszenen Beleuchtungsszenen Managerszenen
OnWillLoadContent Direkt vor dem Laden einer Inhaltsszene
OnContentLoaded Nachdem alle Inhaltsszenen in einem Ladevorgang vollständig geladen und aktiviert wurden
OnWillUnloadContent Direkt vor dem Entladevorgang einer Inhaltsszene
OnContentUnloaded Nachdem alle Inhaltsszenen in einem Entladevorgang vollständig entladen wurden
OnWillLoadLighting Unmittelbar vor dem Laden einer Beleuchtungsszene
OnLightingLoaded Nachdem eine Beleuchtungsszene vollständig geladen und aktiviert wurde
OnWillUnloadLighting Kurz vor dem Entladen einer Beleuchtungsszene
OnLightingUnloaded Nachdem eine Beleuchtungsszene vollständig entladen wurde
OnWillLoadScene Direkt vor dem Laden einer Szene
OnSceneLoaded Nachdem alle Szenen in einem Vorgang vollständig geladen und aktiviert wurden
OnWillUnloadScene Kurz vor dem Entladen einer Szene
OnSceneUnloaded Nachdem eine Szene vollständig entladen wurde

Aktionsbeispiele

Ein weiteres Beispiel für das 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 sind Inhaltsszenen so festgelegt, dass sie beim Laden aktiviert werden. Wenn Sie die Szenenaktivierung manuell steuern möchten, können Sie eine an eine SceneActivationToken beliebige Methode zum Laden von Inhalten ü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 stellt ein Array verfügbarer Inhaltsszenen in der Reihenfolge des Buildindex bereit. 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]);
}