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