Мониторинг загрузки содержимого — MRTK2

Ход выполнения операции сцены

При загрузке или выгрузке содержимого SceneOperationInProgress свойство возвращает значение true. Ход выполнения этой операции можно отслеживать с помощью SceneOperationProgress свойства .

Значение SceneOperationProgress является средним для всех текущих операций асинхронной сцены. В начале загрузки SceneOperationProgress содержимого значение будет равно нулю. После полного завершения SceneOperationProgress будет задано значение 1 и останется на уровне 1 до следующей операции. Обратите внимание, что только операции сцены содержимого влияют на эти свойства.

Эти свойства отражают состояние всей операции от начала до конца, даже если эта операция включает несколько шагов:

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)

Примеры хода выполнения

SceneOperationInProgress может быть полезно, если действие должно быть приостановлено во время загрузки содержимого:

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 можно использовать для отображения диалоговых окон хода выполнения:

public class ProgressDialog : MonoBehaviour
{
    private void Update()
    {
        IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();

        if (sceneSystem.SceneOperationInProgress)
        {
            DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
        }
        else
        {
            HideProgressIndicator();
        }
    }
    ...
}

Мониторинг с помощью действий

Система сцен предоставляет несколько действий, чтобы сообщить вам, когда сцены загружаются или выгружаются. Каждое действие передает имя затронутой сцены.

Если операция загрузки или выгрузки включает несколько сцен, соответствующие действия будут вызываться один раз для каждой затронутой сцены. Они также вызываются сразу после полного завершения операции загрузки или выгрузки. По этой причине рекомендуется использовать действия OnWillUnload для обнаружения содержимого, которое будет уничтожено, в отличие от действий OnUnloaded для обнаружения уничтоженного содержимого после факта.

С другой стороны, поскольку действия OnLoaded вызываются только при активации и полной загрузке всех сцен, использование действий OnLoaded для обнаружения и использования нового содержимого гарантируется в безопасности.

Действие При вызове Сцены содержимого Сцены освещения Сцены руководителя
OnWillLoadContent Непосредственно перед загрузкой сцены содержимого
OnContentLoaded После полной загрузки и активации всех сцен содержимого в операции загрузки
OnWillUnloadContent Непосредственно перед операцией выгрузки сцены содержимого
OnContentUnloaded После полной выгрузки всех сцен содержимого в операции выгрузки
OnWillLoadLighting Непосредственно перед загрузкой сцены освещения
OnLightingLoaded После полной загрузки и активации сцены освещения
OnWillUnloadLighting Непосредственно перед выгрузкой сцены освещения
OnLightingUnloaded После полной выгрузки сцены освещения
OnWillLoadScene Непосредственно перед загрузкой сцены
OnSceneLoaded После полной загрузки и активации всех сцен в операции
OnWillUnloadScene Непосредственно перед выгрузкой сцены
OnSceneUnloaded После полной выгрузки сцены

Примеры действий

Еще один пример диалога хода выполнения с использованием действий и сопрограммы вместо 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;
    }

    ...
}

Управление активацией сцены

По умолчанию сцены содержимого активируются при загрузке. Если вы хотите управлять активацией сцены вручную, можно передать в любой SceneActivationToken метод загрузки содержимого. Если одна операция загружает несколько сцен содержимого, этот маркер активации будет применяться ко всем сценам.

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

Проверка загруженного содержимого

Свойство ContentSceneNames предоставляет массив доступных сцен содержимого в порядке индекса сборки. Вы можете проверка, загружаются ли эти сцены через 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]);
}