Surveillance du chargement du contenu — MRTK2
Progression de l’opération de scène
Lorsque le contenu est en cours de chargement ou de déchargement, la SceneOperationInProgress
propriété retourne true. Vous pouvez surveiller la progression de cette opération via la SceneOperationProgress
propriété .
La SceneOperationProgress
valeur est la moyenne de toutes les opérations de scène asynchrones actuelles. Au début d’un chargement de contenu, SceneOperationProgress
est égal à zéro. Une fois terminé, SceneOperationProgress
est défini sur 1 et reste à 1 jusqu’à ce que l’opération suivante ait lieu. Notez que seules les opérations de scène de contenu affectent ces propriétés.
Ces propriétés reflètent l’état d’une opération entière du début à la fin, même si cette opération comprend plusieurs étapes :
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)
Exemples de progression
SceneOperationInProgress
peut être utile si l’activité doit être suspendue pendant le chargement du contenu :
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
peut être utilisé pour afficher les boîtes de dialogue de progression :
public class ProgressDialog : MonoBehaviour
{
private void Update()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
if (sceneSystem.SceneOperationInProgress)
{
DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
}
else
{
HideProgressIndicator();
}
}
...
}
Surveillance avec des actions
Le système de scène fournit plusieurs actions pour vous permettre de savoir quand des scènes sont chargées ou déchargées. Chaque action relaie le nom de la scène affectée.
Si une opération de chargement ou de déchargement implique plusieurs scènes, les actions pertinentes sont appelées une fois par scène affectée. Ils sont également appelés à la fois lorsque l’opération de chargement ou de déchargement est terminée. Pour cette raison, il est recommandé d’utiliser des actions OnWillUnload pour détecter le contenu qui sera détruit, au lieu d’utiliser des actions OnUnloaded pour détecter le contenu détruit après coup.
D’un autre côté, étant donné que les actions OnLoaded ne sont appelées que lorsque toutes les scènes sont activées et entièrement chargées, l’utilisation d’actions OnLoaded pour détecter et utiliser un nouveau contenu est garantie comme étant sécurisée.
Action | Quand il est appelé | Scènes de contenu | Scènes d’éclairage | Scènes de gestionnaire |
---|---|---|---|---|
OnWillLoadContent |
Juste avant le chargement d’une scène de contenu | • | ||
OnContentLoaded |
Une fois que toutes les scènes de contenu d’une opération de chargement ont été entièrement chargées et activées | • | ||
OnWillUnloadContent |
Juste avant l’opération de déchargement d’une scène de contenu | • | ||
OnContentUnloaded |
Une fois que toutes les scènes de contenu d’une opération de déchargement ont été entièrement déchargées | • | ||
OnWillLoadLighting |
Juste avant le chargement d’une scène d’éclairage | • | ||
OnLightingLoaded |
Une fois qu’une scène d’éclairage a été entièrement chargée et activée | • | ||
OnWillUnloadLighting |
Juste avant le déchargement d’une scène d’éclairage | • | ||
OnLightingUnloaded |
Une fois qu’une scène d’éclairage a été entièrement déchargée | • | ||
OnWillLoadScene |
Juste avant le chargement d’une scène | • | • | • |
OnSceneLoaded |
Une fois que toutes les scènes d’une opération sont entièrement chargées et activées | • | • | • |
OnWillUnloadScene |
Juste avant le déchargement d’une scène | • | • | • |
OnSceneUnloaded |
Après le déchargement complet d’une scène | • | • | • |
Exemples d’actions
Autre exemple de boîte de dialogue de progression utilisant des actions et une coroutine au lieu de 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;
}
...
}
Contrôle de l’activation de la scène
Par défaut, les scènes de contenu sont configurées pour être activées lors du chargement. Si vous souhaitez contrôler manuellement l’activation de la scène, vous pouvez passer un SceneActivationToken
à n’importe quelle méthode de chargement de contenu. Si plusieurs scènes de contenu sont chargées par une seule opération, ce jeton d’activation s’applique à toutes les scènes.
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
Vérification du contenu chargé
La ContentSceneNames
propriété fournit un tableau de scènes de contenu disponibles dans l’ordre de l’index de build. Vous pouvez case activée si ces scènes sont chargées via 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]);
}