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