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