Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Progreso de la operación de escena
Cuando el contenido se carga o 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ónicas actuales. Al principio de una carga de contenido, SceneOperationProgress
será cero. Una vez completada por completo, SceneOperationProgress
se establecerá en 1 y permanecerá en 1 hasta que se lleve a cabo la siguiente operación. Tenga en cuenta que solo las operaciones de la 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 diálogos 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 escena proporciona varias acciones para que sepa 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 escena afectada. También se invocan todos a la vez cuando se completa la operación de carga o descarga. 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 contrario, dado que 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 contenido nuevo es seguro.
Acción | Cuando se invoca | Escenas de contenido | Escenas de iluminación | Escenas del 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 la escena de contenido | • | ||
OnContentUnloaded |
Después de que todas las escenas de contenido de una operación de descarga se hayan descargado por completo | • | ||
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 que una escena de iluminación se haya descargado por completo | • | ||
OnWillLoadScene |
Justo antes de una carga de escena | • | • | • |
OnSceneLoaded |
Después de que todas las escenas de una operación estén completamente cargadas y activadas | • | • | • |
OnWillUnloadScene |
Justo antes de una descarga de escena | • | • | • |
OnSceneUnloaded |
Después de que una escena esté completamente descargada | • | • | • |
Ejemplos de acción
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 índice 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]);
}