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]);
}