Het laden van inhoud bewaken — MRTK2
Voortgang van scènebewerking
Wanneer inhoud wordt geladen of gelost, retourneert de SceneOperationInProgress
eigenschap true. U kunt de voortgang van deze bewerking controleren via de SceneOperationProgress
eigenschap .
De SceneOperationProgress
waarde is het gemiddelde van alle huidige asynchrone scènebewerkingen. Aan het begin van een inhoudsbelasting SceneOperationProgress
is nul. Zodra alles is voltooid, SceneOperationProgress
wordt ingesteld op 1 en blijft deze op 1 totdat de volgende bewerking wordt uitgevoerd. Houd er rekening mee dat alleen bewerkingen in de inhoudsscène van invloed zijn op deze eigenschappen.
Deze eigenschappen weerspiegelen de status van een hele bewerking van begin tot einde, zelfs als die bewerking meerdere stappen omvat:
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)
Voorbeelden van voortgang
SceneOperationInProgress
kan nuttig zijn als de activiteit moet worden onderbroken terwijl inhoud wordt geladen:
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 worden gebruikt om voortgangsdialoogvensters weer te geven:
public class ProgressDialog : MonoBehaviour
{
private void Update()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
if (sceneSystem.SceneOperationInProgress)
{
DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
}
else
{
HideProgressIndicator();
}
}
...
}
Bewaking met acties
Het Scènesysteem biedt verschillende acties om u te laten weten wanneer scènes worden geladen of verwijderd. Elke actie geeft de naam van de betrokken scène door.
Als een laad- of losbewerking meerdere scènes omvat, worden de relevante acties eenmaal per betrokken scène aangeroepen. Ze worden ook allemaal tegelijk aangeroepen wanneer de laad- of losbewerking volledig is voltooid. Daarom is het raadzaam om OnWillUnload-acties te gebruiken om inhoud te detecteren die wordt vernietigd, in plaats van OnUnloaded-acties te gebruiken om vernietigde inhoud achteraf te detecteren.
Aan de andere kant, omdat OnLoaded-acties alleen worden aangeroepen wanneer alle scènes zijn geactiveerd en volledig zijn geladen, is het gebruik van OnLoaded-acties voor het detecteren en gebruiken van nieuwe inhoud gegarandeerd veilig.
Actie | Wanneer deze wordt aangeroepen | Inhoudsscènes | Lichtscènes | Managerscènes |
---|---|---|---|---|
OnWillLoadContent |
Vlak vóór het laden van een inhoudsscène | • | ||
OnContentLoaded |
Nadat alle inhoudsscènes in een laadbewerking volledig zijn geladen en geactiveerd | • | ||
OnWillUnloadContent |
Vlak voor het uitladen van een inhoudsscène | • | ||
OnContentUnloaded |
Nadat alle inhoudsscènes in een uitlaadbewerking volledig zijn uitgeladen | • | ||
OnWillLoadLighting |
Vlak voor het laden van een lichtscène | • | ||
OnLightingLoaded |
Nadat een lichtscène volledig is geladen en geactiveerd | • | ||
OnWillUnloadLighting |
Vlak voordat een lichtscène wordt geladen | • | ||
OnLightingUnloaded |
Nadat een lichtscène volledig is gelost | • | ||
OnWillLoadScene |
Vlak voordat een scène wordt geladen | • | • | • |
OnSceneLoaded |
Nadat alle scènes in een bewerking volledig zijn geladen en geactiveerd | • | • | • |
OnWillUnloadScene |
Vlak voordat een scène wordt uitgeladen | • | • | • |
OnSceneUnloaded |
Nadat een scène volledig is uitgeladen | • | • | • |
Voorbeelden van acties
Een ander voorbeeld van een voortgangsdialoogvenster met acties en een coroutine in plaats van Bijwerken:
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;
}
...
}
Activering van scènes beheren
Standaard worden inhoudscènes zo ingesteld dat ze worden geactiveerd wanneer ze worden geladen. Als u de activering van scènes handmatig wilt beheren, kunt u een SceneActivationToken
doorgeven aan elke laadmethode voor inhoud. Als er meerdere inhoudsscènes worden geladen door één bewerking, is dit activeringstoken van toepassing op alle scènes.
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
Controleren welke inhoud wordt geladen
De ContentSceneNames
eigenschap biedt een matrix van beschikbare inhoudsscènes in volgorde van build-index. U kunt controleren of deze scènes zijn geladen 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]);
}