Monitorização do carregamento de conteúdos


Monitorização com ações

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

Se uma operação de carga ou descarga envolver várias cenas, as ações relevantes serão invocadas uma vez por local afetada. Também são invocados de uma só vez quando a operação de carga ou descarga estiver completamente concluída. Por esta razão, recomenda-se que utilize ações onWillUnload para detetar conteúdos que serão destruídos, em oposição ao uso de ações OnUnloaded para detetar conteúdo destruído após o fato.

Por outro lado, porque as ações onLoaded só são invocadas quando todas as cenas são ativadas e totalmente carregadas, usar ações OnLoaded para detetar e usar novos conteúdos é garantido ser seguro.

Ação Quando é invocado Cenas de Conteúdo Cenas de iluminação Cenas do Gerente
OnWillLoadContent Pouco antes de uma carga de cena de conteúdo
OnContentLoaded Depois de todas as cenas de conteúdo numa operação de carga foram totalmente carregadas e ativadas
OnWillUnloadContent Pouco antes de uma operação de descarregamento de cena de conteúdo
OnContentUnloaded Depois de todas as cenas de conteúdo numa operação de descarga foram 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 Pouco antes de uma carga de cena
OnSceneLoaded Depois de todas as cenas de uma operação são totalmente carregadas e ativadas
OnWillUnloadScene Pouco antes de uma cena descarregar
OnSceneUnloaded Depois de uma cena estar totalmente descarregada

Exemplos de ação

Outro exemplo de diálogo de progresso usando ações e uma coroutina em vez de Atualização:

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

    ...
}

Controlo da ativação da cena

Por predefinição, as cenas de conteúdo são definidas para serem ativadas quando carregadas. Se quiser controlar a ativação da cena manualmente, pode passar um SceneActivationToken a qualquer método de carga de conteúdo. Se várias cenas de conteúdo estiverem a ser carregadas por uma única operação, este token de ativação aplicar-se-á a todas as cenas.

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

Verificação do conteúdo carregado

A ContentSceneNames propriedade fornece uma variedade de cenas de conteúdo disponíveis por ordem de índice de construção. Pode verificar se estas cenas são carregadas através IsContentLoaded(string contentName) de .

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

Progresso da operação de cena

Quando o conteúdo estiver a ser carregado ou descarregado, a SceneOperationInProgress propriedade voltará a ser verdadeira. 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 de async corrente. No início de uma carga de conteúdo, SceneOperationProgress será zero. Uma vez completamente concluída, SceneOperationProgress será definido para 1 e permanecerá em 1 até que a próxima operação ocorra. Note que apenas as operações de cena de conteúdo afetam estas propriedades.

Estas propriedades refletem o estado de toda uma operação 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 for suspensa enquanto o conteúdo estiver 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 exibir diálogos de progresso:

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

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