Layanan transisi adegan — MRTK2

Ekstensi ini menyederhanakan bisnis memudarkan adegan, menampilkan indikator kemajuan, memuat adegan, lalu memudar kembali.

Operasi adegan didorong oleh layanan SceneSystem, tetapi operasi berbasis Tugas apa pun dapat digunakan untuk mendorong transisi.

Mengaktifkan ekstensi

Untuk mengaktifkan ekstensi, buka profil RegisteredServiceProvider Anda. Klik Daftarkan Penyedia Layanan baru untuk menambahkan konfigurasi baru. Di bidang Jenis Komponen, pilih SceneTransitionService. Di bidang Profil Konfigurasi, pilih profil transisi adegan default yang disertakan dengan ekstensi.

Opsi profil

Gunakan indikator kemajuan default

Jika dicentang, prefab indikator kemajuan default akan digunakan ketika tidak ada objek indikator kemajuan yang disediakan saat memanggil DoSceneTransition. Jika objek indikator kemajuan disediakan, default akan diabaikan.

Gunakan warna pudar

Jika dicentang, layanan transisi akan menerapkan pudar selama transisi Anda. Pengaturan ini dapat diubah saat runtime melalui properti layanan UseFadeColor .

Warna pudar

Mengontrol warna efek pudar. Alfa diabaikan. Pengaturan ini dapat diubah pada runtime sebelum transisi melalui properti layanan FadeColor .

Memudarkan target

Mengontrol kamera mana yang akan memiliki efek pudar yang diterapkan padanya. Pengaturan ini dapat diubah saat runtime melalui properti layanan FadeTargets .

Pengaturan Kamera yang Ditargetkan
Utama Menerapkan efek pudar ke kamera utama.
UI Menerapkan efek pudar pada kamera pada lapisan UI. (Tidak memengaruhi antarmuka pengguna overlay)
Semua Berlaku untuk kamera utama dan UI.
Kustom Berlaku untuk sekumpulan kamera kustom yang disediakan melalui SetCustomFadeTargetCameras

Waktu pudar/pudar dalam waktu

Pengaturan default selama durasi pudar saat memasukkan/keluar dari transisi. Pengaturan ini dapat diubah pada runtime melalui properti dan FadeInTime layananFadeOutTime.

jenis fader Kamera

Kelas mana yang ICameraFader akan digunakan untuk menerapkan efek pudar ke kamera. Kelas default CameraFaderQuad membuat instans quad dengan bahan transparan di depan kamera target yang dekat dengan clip plane. Pendekatan lain mungkin menggunakan sistem efek pasca.

Menggunakan ekstensi

Anda menggunakan layanan transisi dengan melewati Tugas yang dijalankan saat kamera memudar.

Menggunakan tugas sistem adegan

Dalam kebanyakan kasus, Anda akan menggunakan Tugas yang disediakan oleh layanan SceneSystem:

private async void TransitionToScene()
{
    IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
    ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();

    // Fades out
    // Runs LoadContent task
    // Fades back in
    await transition.DoSceneTransition(
            () => sceneSystem.LoadContent("TestScene1")
        );
}

Menggunakan tugas kustom

Dalam kasus lain, Anda mungkin ingin melakukan transisi tanpa benar-benar memuat adegan:

private async void TransitionToScene()
{
    ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();

    // Fades out
    // Resets scene
    // Fades back in
    await transition.DoSceneTransition(
            () => ResetScene()
        );
}

private async Task ResetScene()
{
    // Go through all enemies in the current scene and move them back to starting positions
}

Atau Anda mungkin ingin memuat adegan tanpa menggunakan layanan SceneSystem:

private async void TransitionToScene()
{
    ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();

    // Fades out
    // Loads scene using Unity's scene manager
    // Fades back in
    await transition.DoSceneTransition(
            () => LoadScene("TestScene1")
        );
}

private async Task LoadScene(string sceneName)
{
    AsyncOperation asyncOp = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
    while (!asyncOp.isDone)
    {
        await Task.Yield();
    }
}

Menggunakan beberapa tugas

Anda juga dapat menyediakan beberapa tugas, yang akan dijalankan secara berurutan:

private async void TransitionToScene()
{
    IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
    ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();

    // Fades out
    // Sets time scale to 0
    // Fades out audio to 0
    // Loads TestScene1
    // Fades in audio to 1
    // Sets time scale to 1
    // Fades back in
    await transition.DoSceneTransition(
            () => SetTimescale(0f),
            () => FadeAudio(0f, 1f),
            () => sceneSystem.LoadContent("TestScene1"),
            () => FadeAudio(1f, 1f),
            () => SetTimescale(1f)
        );
}

private async Task SetTimescale(float targetTime)
{
    Time.timeScale = targetTime;
    await Task.Yield();
}

private async Task FadeAudio(float targetVolume, float duration)
{
    float startTime = Time.realtimeSinceStartup;
    float startVolume = AudioListener.volume;
    while (Time.realtimeSinceStartup < startTime + duration)
    {
        AudioListener.volume = Mathf.Lerp(startVolume, targetVolume, Time.realtimeSinceStartup - startTime / duration);
        await Task.Yield();
       }
       AudioListener.volume = targetVolume;
}

Menggunakan indikator kemajuan

Indikator kemajuan adalah apa pun yang mengimplementasikan IProgressIndicator antarmuka. Ini dapat berupa layar splash, indikator pemuatan tagalong 3D, atau apa pun yang memberikan umpan balik tentang kemajuan transisi.

Jika UseDefaultProgressIndicator diperiksa di profil SceneTransitionService, indikator kemajuan akan dibuat saat transisi dimulai. Selama durasi transisi, indikator Progress dan Message properti ini dapat diakses melalui metode dan SetProgressMessage layanan tersebutSetProgressValue.

private async void TransitionToScene()
{
    IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
    ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();

    ListenToSceneTransition(sceneSystem, transition);

    await transition.DoSceneTransition(
            () => sceneSystem.LoadContent("TestScene1")
        );
}

private async void ListenToSceneTransition(IMixedRealitySceneSystem sceneSystem, ISceneTransitionService transition)
{
    transition.SetProgressMessage("Starting transition...");

    while (transition.TransitionInProgress)
    {
        if (sceneSystem.SceneOperationInProgress)
        {
            transition.SetProgressMessage("Loading scene...");
            transition.SetProgressValue(sceneSystem.SceneOperationProgress);
        }
        else
        {
            transition.SetProgressMessage("Finished loading scene...");
            transition.SetProgressValue(1);
        }

        await Task.Yield();
    }
}

Atau, saat memanggil DoSceneTransition Anda dapat menyediakan indikator kemajuan Anda sendiri melalui argumen opsional progressIndicator . Ini akan menggantikan indikator kemajuan default.