Überwachen des Ladens von Inhalten – MRTK2
Szenenvorgangsstatus
Wenn Inhalt geladen oder entladen wird, gibt die SceneOperationInProgress
Eigenschaft true zurück. Sie können den Fortschritt dieses Vorgangs über die SceneOperationProgress
-Eigenschaft überwachen.
Der SceneOperationProgress
Wert ist der Durchschnitt aller aktuellen asynchronen Szenenvorgänge. Am Anfang eines Inhaltsladevorgangs SceneOperationProgress
ist null. Nach vollständiger Ausführung SceneOperationProgress
wird auf 1 festgelegt und bleibt bei 1, bis der nächste Vorgang durchgeführt wird. Beachten Sie, dass sich nur Inhaltsszenevorgänge auf diese Eigenschaften auswirken.
Diese Eigenschaften spiegeln den Status eines gesamten Vorgangs von Anfang bis Ende wider, auch wenn dieser Vorgang mehrere Schritte umfasst:
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)
Fortschrittsbeispiele
SceneOperationInProgress
kann nützlich sein, wenn die Aktivität während des Ladens von Inhalten angehalten werden soll:
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
kann verwendet werden, um Statusdialoge anzuzeigen:
public class ProgressDialog : MonoBehaviour
{
private void Update()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
if (sceneSystem.SceneOperationInProgress)
{
DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
}
else
{
HideProgressIndicator();
}
}
...
}
Überwachung mit Aktionen
Das Szenensystem bietet mehrere Aktionen, um Sie darüber zu informieren, wann Szenen geladen oder entladen werden. Jede Aktion gibt den Namen der betroffenen Szene weiter.
Wenn ein Lade- oder Entladevorgang mehrere Szenen umfasst, werden die relevanten Aktionen einmal pro betroffener Szene aufgerufen. Sie werden auch alle gleichzeitig aufgerufen, wenn der Lade- oder Entladevorgang vollständig abgeschlossen ist. Aus diesem Grund wird empfohlen, dass Sie OnWillUnload-Aktionen verwenden, um zerstörte Inhalte zu erkennen, anstatt OnUnloaded-Aktionen zu verwenden, um zerstörte Inhalte nach der Tatsache zu erkennen.
Auf der anderen Seite, da OnLoaded-Aktionen nur aufgerufen werden, wenn alle Szenen aktiviert und vollständig geladen sind, ist die Verwendung von OnLoaded-Aktionen zum Erkennen und Verwenden neuer Inhalte garantiert sicher.
Action | Wenn sie aufgerufen wird | Inhaltsszenen | Beleuchtungsszenen | Managerszenen |
---|---|---|---|---|
OnWillLoadContent |
Direkt vor dem Laden einer Inhaltsszene | • | ||
OnContentLoaded |
Nachdem alle Inhaltsszenen in einem Ladevorgang vollständig geladen und aktiviert wurden | • | ||
OnWillUnloadContent |
Direkt vor dem Entladevorgang einer Inhaltsszene | • | ||
OnContentUnloaded |
Nachdem alle Inhaltsszenen in einem Entladevorgang vollständig entladen wurden | • | ||
OnWillLoadLighting |
Unmittelbar vor dem Laden einer Beleuchtungsszene | • | ||
OnLightingLoaded |
Nachdem eine Beleuchtungsszene vollständig geladen und aktiviert wurde | • | ||
OnWillUnloadLighting |
Kurz vor dem Entladen einer Beleuchtungsszene | • | ||
OnLightingUnloaded |
Nachdem eine Beleuchtungsszene vollständig entladen wurde | • | ||
OnWillLoadScene |
Direkt vor dem Laden einer Szene | • | • | • |
OnSceneLoaded |
Nachdem alle Szenen in einem Vorgang vollständig geladen und aktiviert wurden | • | • | • |
OnWillUnloadScene |
Kurz vor dem Entladen einer Szene | • | • | • |
OnSceneUnloaded |
Nachdem eine Szene vollständig entladen wurde | • | • | • |
Aktionsbeispiele
Ein weiteres Beispiel für das Statusdialogfeld mit Aktionen und einer Coroutine anstelle von 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;
}
...
}
Steuern der Szenenaktivierung
Standardmäßig sind Inhaltsszenen so festgelegt, dass sie beim Laden aktiviert werden. Wenn Sie die Szenenaktivierung manuell steuern möchten, können Sie eine an eine SceneActivationToken
beliebige Methode zum Laden von Inhalten übergeben. Wenn mehrere Inhaltsszenen von einem einzelnen Vorgang geladen werden, gilt dieses Aktivierungstoken für alle Szenen.
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
Überprüfen, welche Inhalte geladen werden
Die ContentSceneNames
-Eigenschaft stellt ein Array verfügbarer Inhaltsszenen in der Reihenfolge des Buildindex bereit. Sie können überprüfen, ob diese Szenen über IsContentLoaded(string contentName)
geladen werden.
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]);
}