Memantau pemuatan konten — MRTK2

Kemajuan operasi adegan

Ketika konten dimuat atau dibongkar, SceneOperationInProgress properti akan mengembalikan true. Anda dapat memantau kemajuan operasi ini melalui SceneOperationProgress properti .

Nilainya SceneOperationProgress adalah rata-rata semua operasi adegan asinkron saat ini. Pada awal beban konten, SceneOperationProgress akan menjadi nol. Setelah selesai sepenuhnya, SceneOperationProgress akan diatur ke 1 dan akan tetap pada 1 hingga operasi berikutnya berlangsung. Perhatikan bahwa hanya operasi adegan konten yang memengaruhi properti ini.

Properti ini mencerminkan status seluruh operasi dari awal hingga akhir, bahkan jika operasi tersebut mencakup beberapa langkah:

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)

Contoh kemajuan

SceneOperationInProgress dapat berguna jika aktivitas harus ditangguhkan saat konten sedang dimuat:

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 dapat digunakan untuk menampilkan dialog kemajuan:

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

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

Pemantauan dengan tindakan

Sistem Adegan menyediakan beberapa tindakan untuk memberi tahu Anda kapan adegan sedang dimuat atau dibongkar. Setiap tindakan menyampaikan nama adegan yang terpengaruh.

Jika operasi pemuatan atau bongkar melibatkan beberapa adegan, tindakan yang relevan akan dipanggil sekali per adegan yang terpengaruh. Mereka juga dipanggil sekaligus ketika operasi pemuatan atau bongkar selesai sepenuhnya. Untuk alasan ini, disarankan agar Anda menggunakan tindakan OnWillUnload untuk mendeteksi konten yang akan dihancurkan, dibandingkan dengan menggunakan tindakan OnUnloaded untuk mendeteksi konten yang dihancurkan setelah fakta.

Di sisi lain, karena tindakan OnLoaded hanya dipanggil ketika semua adegan diaktifkan dan dimuat sepenuhnya, menggunakan tindakan OnLoaded untuk mendeteksi dan menggunakan konten baru dijamin aman.

Tindakan Ketika dipanggil Adegan Konten Adegan Pencahayaan Adegan Manajer
OnWillLoadContent Tepat sebelum pemuatan adegan konten
OnContentLoaded Setelah semua adegan konten dalam operasi pemuatan telah dimuat dan diaktifkan sepenuhnya
OnWillUnloadContent Tepat sebelum operasi bongkar adegan konten
OnContentUnloaded Setelah semua adegan konten dalam operasi bongkar muat telah dibongkar sepenuhnya
OnWillLoadLighting Tepat sebelum pemuatan adegan pencahayaan
OnLightingLoaded Setelah adegan pencahayaan dimuat sepenuhnya dan diaktifkan
OnWillUnloadLighting Tepat sebelum pembongkaran adegan pencahayaan
OnLightingUnloaded Setelah adegan pencahayaan dibongkar sepenuhnya
OnWillLoadScene Tepat sebelum pemuatan adegan
OnSceneLoaded Setelah semua adegan dalam operasi dimuat dan diaktifkan sepenuhnya
OnWillUnloadScene Tepat sebelum bongkar adegan
OnSceneUnloaded Setelah adegan dibongkar sepenuhnya

Contoh tindakan

Contoh dialog kemajuan lain menggunakan tindakan dan koroutin alih-alih Perbarui:

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

    ...
}

Mengontrol aktivasi adegan

Secara default, adegan konten diatur untuk diaktifkan saat dimuat. Jika Anda ingin mengontrol aktivasi adegan secara manual, Anda dapat meneruskan SceneActivationToken ke metode pemuatan konten apa pun. Jika beberapa adegan konten dimuat oleh satu operasi, token aktivasi ini akan berlaku untuk semua adegan.

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

Memeriksa konten mana yang dimuat

Properti ContentSceneNames menyediakan array adegan konten yang tersedia dalam urutan indeks build. Anda dapat memeriksa apakah adegan ini dimuat melalui 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]);
}