Övervaka innehållsläsning
Förlopp för scenåtgärd
När innehåll läses in eller tas bort returnerar SceneOperationInProgress
egenskapen true. Du kan övervaka förloppet för den här åtgärden via SceneOperationProgress
egenskapen .
Värdet SceneOperationProgress
är medelvärdet av alla aktuella asynkrona scenåtgärder. I början av en innehållsbelastning är SceneOperationProgress
noll. När det är klart SceneOperationProgress
anges till 1 och förblir vid 1 tills nästa åtgärd äger rum. Observera att endast åtgärder för innehållsscener påverkar dessa egenskaper.
Dessa egenskaper återspeglar tillståndet för en hel åtgärd från början till slut, även om åtgärden innehåller flera steg:
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)
Förloppsexempel
SceneOperationInProgress
kan vara användbart om aktiviteten ska pausas när innehållet läses in:
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
kan användas för att visa förloppsdialogrutor:
public class ProgressDialog : MonoBehaviour
{
private void Update()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
if (sceneSystem.SceneOperationInProgress)
{
DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
}
else
{
HideProgressIndicator();
}
}
...
}
Övervakning med åtgärder
Scensystemet tillhandahåller flera åtgärder som låter dig veta när scener läses in eller tas bort. Varje åtgärd vidarebefordrar namnet på den berörda scenen.
Om en belastnings- eller avlastningsåtgärd omfattar flera scener, anropas relevanta åtgärder en gång per berörd scen. De anropas också samtidigt när inläsnings- eller avlastningsåtgärden är helt slutförd. Därför rekommenderar vi att du använder onWillUnload-åtgärder för att identifiera innehåll som kommer att förstöras, i stället för att använda OnUnloaded-åtgärder för att identifiera förstöret innehåll i efterhand.
Å andra sidan är det garanterat säkert att använda OnLoaded-åtgärder för att identifiera och använda nytt innehåll eftersom onloaded-åtgärder endast anropas när alla scener aktiveras och läses in fullständigt.
Åtgärd | När den anropas | Innehållsscener | Belysningsscener | Chefsscenerier |
---|---|---|---|---|
OnWillLoadContent |
Precis före en innehållsscenbelastning | • | ||
OnContentLoaded |
När alla innehållsscener i en inläsningsåtgärd har lästs in och aktiverats fullständigt | • | ||
OnWillUnloadContent |
Precis före en avlastningsåtgärd för en innehållsscen | • | ||
OnContentUnloaded |
När alla innehållsscener i en avlastningsåtgärd har tagits bort helt | • | ||
OnWillLoadLighting |
Precis före en belysningsscenbelastning | • | ||
OnLightingLoaded |
När en belysningsscen har lästs in helt och aktiverats | • | ||
OnWillUnloadLighting |
Precis innan en belysningsscen tas bort | • | ||
OnLightingUnloaded |
När en belysningsscen har tagits bort helt | • | ||
OnWillLoadScene |
Precis före en scenbelastning | • | • | • |
OnSceneLoaded |
När alla scener i en åtgärd är helt inlästa och aktiverade | • | • | • |
OnWillUnloadScene |
Precis före en scenavlastning | • | • | • |
OnSceneUnloaded |
När en scen är helt bortladdad | • | • | • |
Åtgärdsexempel
Ett annat förloppsdialogexempel med åtgärder och en koroutine i stället för Uppdatera:
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;
}
...
}
Kontrollera scenaktivering
Som standard är innehållsscenarier inställda på att aktiveras när de läses in. Om du vill kontrollera scenaktiveringen manuellt kan du skicka en till valfri SceneActivationToken
metod för innehållsbelastning. Om flera innehållsscener läses in av en enda åtgärd gäller denna aktiveringstoken för alla scener.
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
Kontrollera vilket innehåll som läses in
Egenskapen ContentSceneNames
innehåller en matris med tillgängliga innehållsscener i ordning efter byggindex. Du kan kontrollera om dessa scener läses in via 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]);
}