Supervisión de la carga de contenido: MRTK2

Progreso de la operación de la escena

Cuando el contenido se carga o se descarga, la SceneOperationInProgress propiedad devolverá true. Puede supervisar el progreso de esta operación a través de la SceneOperationProgress propiedad .

El SceneOperationProgress valor es el promedio de todas las operaciones de escena asincrónica actuales. Al principio de una carga de contenido, SceneOperationProgress será cero. Una vez completada completamente, SceneOperationProgress se establecerá en 1 y permanecerá en 1 hasta que se realice la siguiente operación. Tenga en cuenta que solo las operaciones de escena de contenido afectan a estas propiedades.

Estas propiedades reflejan el estado de una operación completa de principio a fin, incluso si esa operación incluye varios pasos:

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)

Ejemplos de progreso

SceneOperationInProgress puede ser útil si se debe suspender la actividad mientras se carga el contenido:

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 se puede usar para mostrar cuadros de diálogo de progreso:

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

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

Supervisión con acciones

El sistema de escenas proporciona varias acciones que le permiten saber cuándo se cargan o descargan escenas. Cada acción retransmite el nombre de la escena afectada.

Si una operación de carga o descarga implica varias escenas, las acciones pertinentes se invocarán una vez por cada escena afectada. También se invocan a la vez cuando la operación de carga o descarga se completa por completo. Por este motivo, se recomienda usar acciones OnWillUnload para detectar contenido que se destruirá , en lugar de usar acciones OnUnloaded para detectar contenido destruido después del hecho.

En el lado inverso, porque las acciones OnLoaded solo se invocan cuando todas las escenas se activan y se cargan por completo, se garantiza que el uso de acciones OnLoaded para detectar y usar nuevo contenido es seguro.

Acción Cuando se invoca Escenas de contenido Escenas de iluminación Escenas de administrador
OnWillLoadContent Justo antes de la carga de una escena de contenido
OnContentLoaded Después de que todas las escenas de contenido de una operación de carga se hayan cargado y activado por completo
OnWillUnloadContent Justo antes de una operación de descarga de escena de contenido
OnContentUnloaded Después de que todas las escenas de contenido de una operación de descarga se hayan descargado completamente
OnWillLoadLighting Justo antes de una carga de escena de iluminación
OnLightingLoaded Después de que una escena de iluminación se haya cargado y activado por completo
OnWillUnloadLighting Justo antes de descargar una escena de iluminación
OnLightingUnloaded Después de descargar completamente una escena de iluminación
OnWillLoadScene Justo antes de una carga de escena
OnSceneLoaded Después de que todas las escenas de una operación se carguen y activen por completo
OnWillUnloadScene Justo antes de una descarga de escena
OnSceneUnloaded Después de descargar completamente una escena

Ejemplos de acciones

Otro ejemplo de diálogo de progreso mediante acciones y una corrutina en lugar de Actualizar:

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

    ...
}

Control de la activación de la escena

De forma predeterminada, las escenas de contenido se establecen para activarse cuando se cargan. Si desea controlar manualmente la activación de la escena, puede pasar a SceneActivationToken cualquier método de carga de contenido. Si una sola operación carga varias escenas de contenido, este token de activación se aplicará a todas las escenas.

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

Comprobación del contenido que se carga

La ContentSceneNames propiedad proporciona una matriz de escenas de contenido disponibles en orden de compilación. Puede comprobar si estas escenas se cargan a través de 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]);
}