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 della scena asincrona correnti. All'inizio di un caricamento del contenuto, SceneOperationProgress sarà zero. Al termine, SceneOperationProgress verrà impostato su 1 e rimarrà su 1 fino a quando non verrà eseguita l'operazione successiva. 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 stato

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 della scena offre diverse azioni che consentono di sapere 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 inoltre richiamati tutti contemporaneamente quando l'operazione di caricamento o scaricamento viene completata completamente. Per questo motivo è consigliabile usare le azioni OnWillUnload per rilevare il contenuto che verrà eliminato definitivamente, anziché usare le azioni OnUnloaded per rilevare il contenuto eliminato dopo il fatto.

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

Azione Quando viene richiamato Scene di contenuto Scene di illuminazione Scene di gestione
OnWillLoadContent Subito prima del caricamento di una 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 Subito prima di un caricamento 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 Subito prima di un caricamento della scena
OnSceneLoaded Dopo che tutte le scene in un'operazione sono completamente caricate e attivate
OnWillUnloadScene Subito prima dello scaricamento di una scena
OnSceneUnloaded Dopo che una scena è completamente scaricata

Esempi di azioni

Un altro esempio di finestra di dialogo di stato che usa azioni e coroutine invece di 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 l'attivazione durante il caricamento. Se si vuole controllare manualmente l'attivazione della scena, è possibile passare un SceneActivationToken oggetto 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

Controllo del contenuto caricato

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