Monitorování načítání obsahu


Monitorování pomocí akcí

Systém scény poskytuje několik akcí, které vám poznají, kdy se načítá nebo uvolní scény. Každá akce předává název ovlivněné scény.

Pokud operace načtení nebo uvolnění zahrnuje více scén, příslušné akce se pro ovlivněnou scénu vyvolá jednou. Jsou také vyvolány všechny najednou, když je operace načtení nebo uvolnění zcela dokončena. Z tohoto důvodu se doporučuje používat akce OnWillUnload k detekci obsahu, který se zničí, na rozdíl od použití akcí OnUnloaded k detekci zničeného obsahu po faktu.

Na druhou stranu, protože akce OnLoaded jsou vyvolány pouze při aktivaci a úplném načtení všech scén, je zaručeno, že použití akcí OnLoaded k detekci a použití nového obsahu bude bezpečné.

Akce Při vyvolání Scény obsahu Osvětlení scény Manažerové scény
OnWillLoadContent Těsně před načtením scény obsahu
OnContentLoaded Po úplném načtení a aktivaci všech scén obsahu v operaci načtení
OnWillUnloadContent Těsně před operací uvolnění scény obsahu
OnContentUnloaded Po úplném uvolnění všech scén obsahu v operaci uvolnění
OnWillLoadLighting Těsně před zatížením osvětlení scény
OnLightingLoaded Po úplném načtení a aktivaci osvětlení scény
OnWillUnloadLighting Těsně před uvolněním osvětlení scény
OnLightingUnloaded Po úplném uvolnění osvětlení scény
OnWillLoadScene Těsně před načtením scény
OnSceneLoaded Po úplném načtení a aktivaci všech scén v operaci
OnWillUnloadScene Těsně před uvolněním scény
OnSceneUnloaded Po úplném uvolnění scény

Příklady akcí

Další příklad dialogového okna s průběhem, který místo možnosti Aktualizovat používá akce a korutinu:

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

    ...
}

Řízení aktivace scény

Ve výchozím nastavení jsou scény obsahu nastavené na aktivaci při načtení. Pokud chcete aktivaci scény řídit ručně, můžete předat metodě načtení obsahu SceneActivationToken . Pokud jednu operaci načítá více scén obsahu, tento aktivační token se použije na všechny scény.

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

Kontrola načteného obsahu

Vlastnost ContentSceneNames poskytuje pole dostupných scén obsahu v pořadí podle indexu sestavení. Můžete zkontrolovat, jestli se tyto scény načítá prostřednictvím 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]);
}

Průběh operace scény

Při načítání nebo uvolňování obsahu vrátí SceneOperationInProgress vlastnost hodnotu true. Průběh této operace můžete monitorovat prostřednictvím SceneOperationProgress vlastnosti .

Hodnota SceneOperationProgress je průměr všech aktuálních operací asynchronní scény. Na začátku načtení obsahu bude SceneOperationProgress nula. Po úplném dokončení se nastaví na hodnotu 1 a zůstane na SceneOperationProgress 1, dokud neprovede další operace. Tyto vlastnosti ovlivňují pouze operace scény obsahu.

Tyto vlastnosti odrážejí stav celé operace od začátku do konce, i když tato operace zahrnuje několik kroků:

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říklady průběhu

SceneOperationInProgress může být užitečné v případě, že by měla být aktivita během načítání obsahu pozastavena:

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 lze použít k zobrazení dialogových oknů průběhu:

public class ProgressDialog : MonoBehaviour
{
    private void Update()
    {
        IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();

        if (sceneSystem.SceneOperationInProgress)
        {
            DisplayProgressIndicator(sceneSystem.SceneOperationProgress);
        }
        else
        {
            HideProgressIndicator();
        }
    }
    ...
}