Udostępnij za pośrednictwem


Monitorowanie ładowania zawartości — MRTK2

Postęp operacji sceny

Po załadowaniu lub zwolnieniu SceneOperationInProgress zawartości właściwość zwróci wartość true. Postęp tej operacji można monitorować za pośrednictwem SceneOperationProgress właściwości .

Wartość SceneOperationProgress to średnia wszystkich bieżących operacji asynchronicznych scen. Na początku ładowania SceneOperationProgress zawartości będzie zero. Po zakończeniu SceneOperationProgress zostanie ustawiona wartość 1 i pozostanie na 1 do momentu następnego wykonania operacji. Należy pamiętać, że tylko operacje sceny zawartości wpływają na te właściwości.

Te właściwości odzwierciedlają stan całej operacji od początku do zakończenia, nawet jeśli ta operacja zawiera wiele kroków:

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)

Przykłady postępu

SceneOperationInProgress może być przydatne, jeśli działanie powinno zostać zawieszone podczas ładowania zawartości:

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 może służyć do wyświetlania okien dialogowych postępu:

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

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

Monitorowanie za pomocą akcji

System scen udostępnia kilka akcji, które pozwalają poinformować o ładowaniu lub zwalnianiu scen. Każda akcja przekazuje nazwę objętej sceny.

Jeśli operacja ładowania lub zwalniania obejmuje wiele scen, odpowiednie akcje będą wywoływane raz na scenę, której dotyczy problem. Są one również wywoływane jednocześnie, gdy operacja ładowania lub zwalniania jest w pełni ukończona. Z tego powodu zaleca się używanie akcji OnWillUnload do wykrywania zawartości, która zostanie zniszczona, w przeciwieństwie do używania akcji OnUnloaded do wykrywania zniszczonej zawartości po tym fakcie.

Po drugiej stronie, ponieważ akcje OnLoaded są wywoływane tylko wtedy, gdy wszystkie sceny są aktywowane i w pełni załadowane, przy użyciu akcji OnLoaded do wykrywania i używania nowej zawartości gwarantuje bezpieczeństwo.

Akcja Po wywołaniu Sceny zawartości Sceny oświetleniowe Sceny menedżera
OnWillLoadContent Tuż przed załadowaniem sceny zawartości
OnContentLoaded Po pełnym załadowaniu i aktywowaniu wszystkich scen zawartości w operacji ładowania
OnWillUnloadContent Tuż przed operacją zwalniania sceny zawartości
OnContentUnloaded Po pełnym rozładowaniu wszystkich scen zawartości w operacji zwalniania
OnWillLoadLighting Tuż przed obciążeniem sceny oświetleniowej
OnLightingLoaded Po pełnym załadowaniu i aktywowaniu sceny oświetleniowej
OnWillUnloadLighting Tuż przed zwolnieniem sceny oświetleniowej
OnLightingUnloaded Po pełnym rozładowaniu sceny oświetleniowej
OnWillLoadScene Tuż przed załadowaniem sceny
OnSceneLoaded Po pełnym załadowaniu i aktywowaniu wszystkich scen operacji
OnWillUnloadScene Tuż przed zwolnieniem sceny
OnSceneUnloaded Po pełnym rozładowaniu sceny

Przykłady akcji

Inny przykład okna dialogowego postępu przy użyciu akcji i coroutine zamiast Aktualizacji:

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

    ...
}

Kontrolowanie aktywacji sceny

Domyślnie sceny zawartości są ustawiane na aktywowanie podczas ładowania. Jeśli chcesz ręcznie kontrolować aktywację sceny, możesz przekazać element SceneActivationToken do dowolnej metody ładowania zawartości. Jeśli wiele scen zawartości jest ładowanych przez jedną operację, ten token aktywacji będzie stosowany do wszystkich scen.

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

Sprawdzanie, która zawartość jest ładowana

Właściwość ContentSceneNames udostępnia tablicę dostępnych scen zawartości w kolejności indeksu kompilacji. Możesz sprawdzić, czy te sceny są ładowane za pośrednictwem polecenia 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]);
}