Monitoraggio del caricamento del contenuto

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 correnti della scena asincrona. 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 di 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 le finestre di dialogo 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

Scene System (Sistema scena) fornisce diverse azioni per sapere quando le scene vengono caricate o scaricate. Ogni azione inoltra il nome della scena interessata.

Se un'operazione di caricamento o scaricamento include 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 è stata completata completamente. Per questo motivo è consigliabile usare le azioni OnWillUnload per rilevare il contenuto che verrà eliminato in modo eliminato, anziché usare le azioni OnUnloaded per rilevare il contenuto eliminato dopo il fatto.

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

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

Esempi di azioni

Un altro esempio di finestra di dialogo di stato che usa azioni e una 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 sono impostate per l'attivazione quando vengono caricate. Se si vuole controllare manualmente l'attivazione della scena, è possibile passare a SceneActivationToken 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]);
}