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