Övervaka innehållsinläsning – MRTK2
Förlopp för scenåtgärd
När innehållet läses in eller tas bort SceneOperationInProgress
returnerar egenskapen true. Du kan övervaka förloppet för den här åtgärden via SceneOperationProgress
egenskapen .
Värdet SceneOperationProgress
är genomsnittet av alla aktuella asynkrona scenåtgärder. I början av en innehållsinläsning SceneOperationProgress
blir noll. När den är helt slutförd SceneOperationProgress
ställs den in på 1 och förblir 1 tills nästa åtgärd äger rum. Observera att endast innehållsscenåtgärder 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 medan 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 innehåller flera åtgärder som meddelar dig när scener läses in eller tas bort. Varje åtgärd vidarebefordrar namnet på den berörda scenen.
Om en inläsnings- eller avlastningsåtgärd omfattar flera scener anropas relevanta åtgärder en gång per berörd scen. De anropas också samtidigt när belastnings- 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ört innehåll i efterhand.
Å andra sidan, eftersom OnLoaded-åtgärder endast anropas när alla scener aktiveras och läses in fullständigt, är det garanterat säkert att använda OnLoaded-åtgärder för att identifiera och använda nytt innehåll.
Åtgärd | När den anropas | Innehållsscener | Ljusscener | Chefsscener |
---|---|---|---|---|
OnWillLoadContent |
Precis innan en innehållsscen läses in | • | ||
OnContentLoaded |
När alla innehållsscener i en inläsningsåtgärd har lästs in helt och aktiverats | • | ||
OnWillUnloadContent |
Precis före en lossningsåtgärd för innehållsscen | • | ||
OnContentUnloaded |
När alla innehållsscener i en avlastningsåtgärd har tagits bort helt | • | ||
OnWillLoadLighting |
Strax före en ljusscenbelastning | • | ||
OnLightingLoaded |
Efter att en belysningsscen har lästs in och aktiverats fullt ut | • | ||
OnWillUnloadLighting |
Precis innan en belysningsscen lossas | • | ||
OnLightingUnloaded |
Efter att en belysningsscen har lossats helt | • | ||
OnWillLoadScene |
Precis före en sceninläsning | • | • | • |
OnSceneLoaded |
När alla scener i en åtgärd är helt inlästa och aktiverade | • | • | • |
OnWillUnloadScene |
Precis innan en scen lossas | • | • | • |
OnSceneUnloaded |
När en scen är helt urladdad | • | • | • |
Åtgärdsexempel
Ett annat exempel på förloppsdialogruta som använder åtgärder och en coroutine 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ållsscener inställda på att aktiveras när de läses in. Om du vill styra scenaktivering manuellt kan du skicka en SceneActivationToken
till valfri innehållsinläsningsmetod. Om flera innehållsscener läses in av en enda åtgärd gäller den här 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
tillhandahå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]);
}