Tartalombetöltés monitorozása – MRTK2
Jelenetművelet állapota
A tartalom betöltésekor vagy eltávolításakor a SceneOperationInProgress
tulajdonság true (igaz) értéket ad vissza. A művelet előrehaladását a tulajdonságon keresztül SceneOperationProgress
figyelheti.
Az SceneOperationProgress
érték az összes aktuális aszinkron jelenetművelet átlaga. A tartalombetöltés SceneOperationProgress
kezdete nulla lesz. A teljes művelet befejezése után az 1 értékre lesz állítva, SceneOperationProgress
és a következő művelet végrehajtásáig 1-nél marad. Vegye figyelembe, hogy ezekre a tulajdonságokra csak a tartalomjelenet-műveletek vannak hatással.
Ezek a tulajdonságok egy teljes művelet állapotát tükrözik az elejétől a végéig, még akkor is, ha a művelet több lépést is tartalmaz:
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)
Példák a folyamatra
SceneOperationInProgress
hasznos lehet, ha a tevékenységet fel kell függeszteni a tartalom betöltése közben:
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
a folyamatjelző párbeszédpanelek megjelenítésére használható:
public class ProgressDialog : MonoBehaviour
{
private void Update()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
if (sceneSystem.SceneOperationInProgress)
{
DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
}
else
{
HideProgressIndicator();
}
}
...
}
Monitorozás műveletekkel
A Jelenetrendszer számos műveletet biztosít, amelyek segítségével tudathatja, hogy a jelenetek betöltése vagy eltávolítása folyamatban van. Minden művelet továbbítja az érintett jelenet nevét.
Ha egy be- vagy kirakodási művelet több jelenetet is magában foglal, a megfelelő műveletek az érintett jelenetenként egyszer lesznek meghívva. A rendszer egyszerre is meghívja őket, amikor a be- vagy kirakodási művelet teljesen befejeződött. Ezért ajánlott onWillUnload műveletekkel észlelni a megsemmisítendő tartalmakat, nem pedig onUnloaded műveletekkel észlelni a megsemmisített tartalmakat a tény után.
A tükrözési oldalon, mivel a Betöltött műveletek csak akkor lesznek meghívva, ha az összes jelenet aktiválva van és teljes mértékben betöltve, az új tartalmak észlelésére és használatára a Betöltött műveletek használata garantáltan biztonságos.
Művelet | A meghíváskor | Tartalomjelenetek | Világítási jelenetek | Kezelői jelenetek |
---|---|---|---|---|
OnWillLoadContent |
Közvetlenül a tartalomjelenet betöltése előtt | • | ||
OnContentLoaded |
Miután a betöltési művelet összes tartalomjelenete teljesen be lett töltve és aktiválva lett | • | ||
OnWillUnloadContent |
Közvetlenül a tartalomjelenet kiürítési művelete előtt | • | ||
OnContentUnloaded |
Miután a kiürítési művelet összes tartalomjelenete teljesen ki lett ürítve | • | ||
OnWillLoadLighting |
Közvetlenül a megvilágítási jelenet betöltése előtt | • | ||
OnLightingLoaded |
A világítási jelenet teljes betöltése és aktiválása után | • | ||
OnWillUnloadLighting |
Közvetlenül a világítási jelenet eltávolítása előtt | • | ||
OnLightingUnloaded |
Miután a világítási jelenet teljesen kipakolódott | • | ||
OnWillLoadScene |
Közvetlenül a jelenet betöltése előtt | • | • | • |
OnSceneLoaded |
Miután egy művelet összes jelenete teljesen betöltődött és aktiválódott | • | • | • |
OnWillUnloadScene |
Közvetlenül a jelenet eltávolítása előtt | • | • | • |
OnSceneUnloaded |
Miután egy jelenet teljesen kiürült | • | • | • |
Példaműveletekre
Egy másik folyamatjelző párbeszédpanel, amely műveleteket és coroutine-t használ a Frissítés helyett:
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;
}
...
}
Jelenetaktiválás szabályozása
Alapértelmezés szerint a tartalomjelenetek aktiválásra vannak beállítva, amikor betöltik. Ha manuálisan szeretné vezérelni a jelenetaktiválást, bármely tartalombetöltési módszernek átadhat egy SceneActivationToken
értéket. Ha egyetlen művelet több tartalomjelenetet tölt be, ez az aktiválási jogkivonat az összes jelenetre érvényes lesz.
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
A betöltött tartalom ellenőrzése
A ContentSceneNames
tulajdonság az elérhető tartalomjelenetek tömbje, a buildindex sorrendjében. Ellenőrizheti, hogy a rendszer betölti-e ezeket a jeleneteket a használatával 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]);
}