Monitorowanie ładowania zawartości — MRTK2
Postęp operacji sceny
Po załadowaniu lub zwolnieniu SceneOperationInProgress
zawartości właściwość zwróci wartość true. Postęp tej operacji można monitorować za pośrednictwem SceneOperationProgress
właściwości .
Wartość SceneOperationProgress
to średnia wszystkich bieżących operacji asynchronicznych scen. Na początku ładowania SceneOperationProgress
zawartości będzie zero. Po zakończeniu SceneOperationProgress
zostanie ustawiona wartość 1 i pozostanie na 1 do momentu następnego wykonania operacji. Należy pamiętać, że tylko operacje sceny zawartości wpływają na te właściwości.
Te właściwości odzwierciedlają stan całej operacji od początku do zakończenia, nawet jeśli ta operacja zawiera wiele kroków:
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)
Przykłady postępu
SceneOperationInProgress
może być przydatne, jeśli działanie powinno zostać zawieszone podczas ładowania zawartości:
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
może służyć do wyświetlania okien dialogowych postępu:
public class ProgressDialog : MonoBehaviour
{
private void Update()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
if (sceneSystem.SceneOperationInProgress)
{
DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
}
else
{
HideProgressIndicator();
}
}
...
}
Monitorowanie za pomocą akcji
System scen udostępnia kilka akcji, które pozwalają poinformować o ładowaniu lub zwalnianiu scen. Każda akcja przekazuje nazwę objętej sceny.
Jeśli operacja ładowania lub zwalniania obejmuje wiele scen, odpowiednie akcje będą wywoływane raz na scenę, której dotyczy problem. Są one również wywoływane jednocześnie, gdy operacja ładowania lub zwalniania jest w pełni ukończona. Z tego powodu zaleca się używanie akcji OnWillUnload do wykrywania zawartości, która zostanie zniszczona, w przeciwieństwie do używania akcji OnUnloaded do wykrywania zniszczonej zawartości po tym fakcie.
Po drugiej stronie, ponieważ akcje OnLoaded są wywoływane tylko wtedy, gdy wszystkie sceny są aktywowane i w pełni załadowane, przy użyciu akcji OnLoaded do wykrywania i używania nowej zawartości gwarantuje bezpieczeństwo.
Akcja | Po wywołaniu | Sceny zawartości | Sceny oświetleniowe | Sceny menedżera |
---|---|---|---|---|
OnWillLoadContent |
Tuż przed załadowaniem sceny zawartości | • | ||
OnContentLoaded |
Po pełnym załadowaniu i aktywowaniu wszystkich scen zawartości w operacji ładowania | • | ||
OnWillUnloadContent |
Tuż przed operacją zwalniania sceny zawartości | • | ||
OnContentUnloaded |
Po pełnym rozładowaniu wszystkich scen zawartości w operacji zwalniania | • | ||
OnWillLoadLighting |
Tuż przed obciążeniem sceny oświetleniowej | • | ||
OnLightingLoaded |
Po pełnym załadowaniu i aktywowaniu sceny oświetleniowej | • | ||
OnWillUnloadLighting |
Tuż przed zwolnieniem sceny oświetleniowej | • | ||
OnLightingUnloaded |
Po pełnym rozładowaniu sceny oświetleniowej | • | ||
OnWillLoadScene |
Tuż przed załadowaniem sceny | • | • | • |
OnSceneLoaded |
Po pełnym załadowaniu i aktywowaniu wszystkich scen operacji | • | • | • |
OnWillUnloadScene |
Tuż przed zwolnieniem sceny | • | • | • |
OnSceneUnloaded |
Po pełnym rozładowaniu sceny | • | • | • |
Przykłady akcji
Inny przykład okna dialogowego postępu przy użyciu akcji i coroutine zamiast Aktualizacji:
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;
}
...
}
Kontrolowanie aktywacji sceny
Domyślnie sceny zawartości są ustawiane na aktywowanie podczas ładowania. Jeśli chcesz ręcznie kontrolować aktywację sceny, możesz przekazać element SceneActivationToken
do dowolnej metody ładowania zawartości. Jeśli wiele scen zawartości jest ładowanych przez jedną operację, ten token aktywacji będzie stosowany do wszystkich scen.
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
Sprawdzanie, która zawartość jest ładowana
Właściwość ContentSceneNames
udostępnia tablicę dostępnych scen zawartości w kolejności indeksu kompilacji. Możesz sprawdzić, czy te sceny są ładowane za pośrednictwem polecenia 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]);
}