Monitoraggio del caricamento del contenuto - MRTK2

Stato dell'operazione della scena

Quando il contenuto viene caricato o scaricato, la SceneOperationInProgress proprietà restituirà true. È possibile monitorare lo stato di avanzamento di questa operazione tramite la SceneOperationProgress proprietà .

Il SceneOperationProgress valore è la media di tutte le operazioni di scena asincrone correnti. All'inizio di un carico SceneOperationProgress di contenuto, sarà zero. Una volta completato, SceneOperationProgress verrà impostato su 1 e rimarrà a 1 fino a quando l'operazione successiva non viene eseguita. Si noti che solo le operazioni della scena del contenuto influiscono su queste proprietà.

Queste proprietà riflettono lo stato di un'intera operazione dall'inizio alla fine, anche se tale operazione include più passaggi:

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)

Esempi di avanzamento

SceneOperationInProgress può essere utile se l'attività deve essere sospesa durante il caricamento del contenuto:

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 può essere usato per visualizzare i dialoghi di stato:

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

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

Monitoraggio con azioni

Il sistema scena fornisce diverse azioni per informare quando le scene vengono caricate o scaricate. Ogni azione inoltra il nome della scena interessata.

Se un'operazione di caricamento o scaricamento comporta più scene, le azioni pertinenti verranno richiamate una volta per ogni scena interessata. Vengono richiamati anche tutti contemporaneamente al completamento dell'operazione di caricamento o scaricamento . Per questo motivo è consigliabile usare azioni OnWillUnload per rilevare il contenuto che verrà eliminato, anziché usare azioni OnUnloaded per rilevare il contenuto distrutto dopo il fatto.

Sul lato capovolgimento, poiché le azioni OnLoaded vengono richiamate solo quando tutte le scene vengono attivate e completamente caricate, l'uso delle azioni OnLoaded per rilevare e usare il nuovo contenuto è garantito che sia sicuro.

Azione Quando viene richiamato Scene di contenuto Scene di illuminazione Scene di gestione
OnWillLoadContent Prima di un caricamento della scena del contenuto
OnContentLoaded Dopo che tutte le scene di contenuto in un'operazione di caricamento sono state completamente caricate e attivate
OnWillUnloadContent Prima di un'operazione di scaricamento della scena del contenuto
OnContentUnloaded Dopo che tutte le scene di contenuto in un'operazione di scaricamento sono state scaricate completamente
OnWillLoadLighting Prima di un carico della scena di illuminazione
OnLightingLoaded Dopo che una scena di illuminazione è stata completamente caricata e attivata
OnWillUnloadLighting Prima di scaricare una scena di illuminazione
OnLightingUnloaded Dopo che una scena di illuminazione è stata completamente scaricata
OnWillLoadScene Prima di un caricamento della scena
OnSceneLoaded Dopo che tutte le scene in un'operazione vengono completamente caricate e attivate
OnWillUnloadScene Appena prima di scaricare una scena
OnSceneUnloaded Dopo che una scena viene scaricata completamente

Esempi di azioni

Un altro esempio di dialogo di stato usa azioni e coroutine anziché 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;
    }

    ...
}

Controllo dell'attivazione della scena

Per impostazione predefinita, le scene di contenuto vengono impostate per attivare quando vengono caricate. Se si vuole controllare manualmente l'attivazione della scena, è possibile passare un SceneActivationToken a qualsiasi metodo di caricamento del contenuto. Se più scene di contenuto vengono caricate da una singola operazione, questo token di attivazione verrà applicato a tutte le scene.

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

Verifica del contenuto caricato

La ContentSceneNames proprietà fornisce una matrice di scene di contenuto disponibili in ordine di indice di compilazione. È possibile verificare se queste scene vengono caricate tramite 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]);
}