Monitorização do carregamento de conteúdos — MRTK2

Progresso da operação de cena

Quando o conteúdo está a ser carregado ou descarregado, a SceneOperationInProgress propriedade devolverá verdadeiro. Pode monitorizar o progresso desta operação através da SceneOperationProgress propriedade .

O SceneOperationProgress valor é a média de todas as operações de cena assíncronas atuais. No início de uma carga de conteúdo, SceneOperationProgress será zero. Após a conclusão completa, SceneOperationProgress será definida como 1 e permanecerá em 1 até que a próxima operação ocorra. Tenha em atenção que apenas as operações de cena de conteúdo afetam estas propriedades.

Estas propriedades refletem o estado de uma operação completa do início ao fim, mesmo que essa operação inclua vários passos:

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)

Exemplos de progresso

SceneOperationInProgress pode ser útil se a atividade deve ser suspensa enquanto o conteúdo está a ser carregado:

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 pode ser utilizado para apresentar caixas de diálogo de progresso:

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

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

Monitorização com ações

O Sistema de Cenas fornece várias ações para informá-lo quando as cenas estão a ser carregadas ou descarregadas. Cada ação reencaminha o nome da cena afetada.

Se uma operação de carregamento ou descarregamento envolver várias cenas, as ações relevantes serão invocadas uma vez por cena afetada. Também são invocados de uma só vez quando a operação de carregamento ou descarregamento estiver totalmente concluída. Por este motivo, recomenda-se que utilize ações OnWillUnload para detetar conteúdos que serão destruídos, em oposição à utilização de ações OnUnloaded para detetar conteúdo destruído após o facto.

Por outro lado, porque as ações OnLoaded só são invocadas quando todas as cenas são ativadas e totalmente carregadas, a utilização de ações OnLoaded para detetar e utilizar novos conteúdos é garantidamente segura.

Ação Quando é invocada Cenas de Conteúdo Cenas de Iluminação Cenas do Gestor
OnWillLoadContent Imediatamente antes de uma carga de cenas de conteúdo
OnContentLoaded Depois de todas as cenas de conteúdo numa operação de carga terem sido totalmente carregadas e ativadas
OnWillUnloadContent Imediatamente antes de uma operação de descarregamento de cenas de conteúdo
OnContentUnloaded Depois de todas as cenas de conteúdo numa operação de descarregamento terem sido totalmente descarregadas
OnWillLoadLighting Pouco antes de uma carga de cena de iluminação
OnLightingLoaded Depois de uma cena de iluminação ter sido totalmente carregada e ativada
OnWillUnloadLighting Pouco antes de uma cena de iluminação descarregar
OnLightingUnloaded Depois de uma cena de iluminação ter sido totalmente descarregada
OnWillLoadScene Imediatamente antes de uma carga de cena
OnSceneLoaded Depois de todas as cenas numa operação estarem totalmente carregadas e ativadas
OnWillUnloadScene Pouco antes de uma cena descarregar
OnSceneUnloaded Depois de uma cena ser totalmente descarregada

Exemplos de ação

Outro exemplo de caixa de diálogo de progresso com ações e um coroutine em vez de Atualizar:

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

    ...
}

Controlar a ativação de cenas

Por predefinição, as cenas de conteúdo estão definidas para serem ativadas quando carregadas. Se quiser controlar a ativação de cena manualmente, pode transmitir um SceneActivationToken para qualquer método de carregamento de conteúdos. Se várias cenas de conteúdo estiverem a ser carregadas por uma única operação, este token de ativação será aplicado a todos os cenários.

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

Verificar que conteúdo está carregado

A ContentSceneNames propriedade fornece uma matriz de cenas de conteúdo disponíveis por ordem de índice de compilação. Pode verificar se estas cenas são carregadas atravé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]);
}