Monitoraggio del caricamento del contenuto - MRTK2
Stato dell'operazione della scena
Quando il contenuto viene caricato o scaricato, la SceneOperationInProgress
proprietà restituirà true. È possibile monitorare lo stato di avanzamento di questa operazione tramite la SceneOperationProgress
proprietà .
Il SceneOperationProgress
valore è la media di tutte le operazioni di scena asincrone correnti. All'inizio di un carico SceneOperationProgress
di contenuto, sarà zero. Una volta completato, SceneOperationProgress
verrà impostato su 1 e rimarrà a 1 fino a quando l'operazione successiva non viene eseguita. Si noti che solo le operazioni della scena del contenuto influiscono su queste proprietà.
Queste proprietà riflettono lo stato di un'intera operazione dall'inizio alla fine, anche se tale operazione include più passaggi:
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)
Esempi di avanzamento
SceneOperationInProgress
può essere utile se l'attività deve essere sospesa durante il caricamento del contenuto:
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
può essere usato per visualizzare i dialoghi di stato:
public class ProgressDialog : MonoBehaviour
{
private void Update()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
if (sceneSystem.SceneOperationInProgress)
{
DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
}
else
{
HideProgressIndicator();
}
}
...
}
Monitoraggio con azioni
Il sistema scena fornisce diverse azioni per informare quando le scene vengono caricate o scaricate. Ogni azione inoltra il nome della scena interessata.
Se un'operazione di caricamento o scaricamento comporta più scene, le azioni pertinenti verranno richiamate una volta per ogni scena interessata. Vengono richiamati anche tutti contemporaneamente al completamento dell'operazione di caricamento o scaricamento . Per questo motivo è consigliabile usare azioni OnWillUnload per rilevare il contenuto che verrà eliminato, anziché usare azioni OnUnloaded per rilevare il contenuto distrutto dopo il fatto.
Sul lato capovolgimento, poiché le azioni OnLoaded vengono richiamate solo quando tutte le scene vengono attivate e completamente caricate, l'uso delle azioni OnLoaded per rilevare e usare il nuovo contenuto è garantito che sia sicuro.
Azione | Quando viene richiamato | Scene di contenuto | Scene di illuminazione | Scene di gestione |
---|---|---|---|---|
OnWillLoadContent |
Prima di un caricamento della scena del contenuto | • | ||
OnContentLoaded |
Dopo che tutte le scene di contenuto in un'operazione di caricamento sono state completamente caricate e attivate | • | ||
OnWillUnloadContent |
Prima di un'operazione di scaricamento della scena del contenuto | • | ||
OnContentUnloaded |
Dopo che tutte le scene di contenuto in un'operazione di scaricamento sono state scaricate completamente | • | ||
OnWillLoadLighting |
Prima di un carico della scena di illuminazione | • | ||
OnLightingLoaded |
Dopo che una scena di illuminazione è stata completamente caricata e attivata | • | ||
OnWillUnloadLighting |
Prima di scaricare una scena di illuminazione | • | ||
OnLightingUnloaded |
Dopo che una scena di illuminazione è stata completamente scaricata | • | ||
OnWillLoadScene |
Prima di un caricamento della scena | • | • | • |
OnSceneLoaded |
Dopo che tutte le scene in un'operazione vengono completamente caricate e attivate | • | • | • |
OnWillUnloadScene |
Appena prima di scaricare una scena | • | • | • |
OnSceneUnloaded |
Dopo che una scena viene scaricata completamente | • | • | • |
Esempi di azioni
Un altro esempio di dialogo di stato usa azioni e coroutine anziché 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;
}
...
}
Controllo dell'attivazione della scena
Per impostazione predefinita, le scene di contenuto vengono impostate per attivare quando vengono caricate. Se si vuole controllare manualmente l'attivazione della scena, è possibile passare un SceneActivationToken
a qualsiasi metodo di caricamento del contenuto. Se più scene di contenuto vengono caricate da una singola operazione, questo token di attivazione verrà applicato a tutte le scene.
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 del contenuto caricato
La ContentSceneNames
proprietà fornisce una matrice di scene di contenuto disponibili in ordine di indice di compilazione. È possibile verificare se queste scene vengono caricate tramite 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]);
}