Supervisión de la carga de contenido
Progreso de la operación de escena
Cuando se carga o descarga contenido, la SceneOperationInProgress
propiedad devuelve 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 completado 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 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 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
Scene System proporciona varias acciones para que sepa cuándo se cargan o descargan las 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 todas a la vez cuando la operación de carga o descarga se completa. Por este motivo, se recomienda usar acciones OnWillUnload para detectar el contenido que se destruirá, en lugar de usar acciones OnUnloaded para detectar contenido destructor después del hecho.
Por otro lado, dado que las acciones OnLoaded solo se invocan cuando todas las escenas se activan y se cargan completamente, se garantiza que el uso de acciones OnLoaded para detectar y usar contenido nuevo sea 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 |
Una vez que todas las escenas de contenido de una operación de carga se han cargado y activado completamente | • | ||
OnWillUnloadContent |
Justo antes de una operación de descarga de una escena de contenido | • | ||
OnContentUnloaded |
Una vez que todas las escenas de contenido de una operación de descarga se han descargado completamente | • | ||
OnWillLoadLighting |
Justo antes de una carga de escena de iluminación | • | ||
OnLightingLoaded |
Una vez que una escena de iluminación se ha cargado y activado completamente | • | ||
OnWillUnloadLighting |
Justo antes de que se descargue una escena de iluminación | • | ||
OnLightingUnloaded |
Una vez que se ha descargado completamente una escena de iluminación | • | ||
OnWillLoadScene |
Justo antes de una carga de escena | • | • | • |
OnSceneLoaded |
Una vez que todas las escenas de una operación se cargan y activan por completo | • | • | • |
OnWillUnloadScene |
Justo antes de que se descargue una escena | • | • | • |
OnSceneUnloaded |
Después de descargar completamente una escena | • | • | • |
Ejemplos de acciones
Otro ejemplo de diálogo de progreso mediante acciones y una corrotina 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 un a cualquier SceneActivationToken
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]);
}