Мониторинг загрузки содержимого — 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 После полной выгрузки сцены

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

Другой пример диалога хода выполнения с помощью действий и сопрограммы вместо обновления:

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