Sahne geçiş hizmeti

Bu uzantı, bir sahneyi atma, ilerleme göstergesini görüntüleme, bir sahneyi yükleme ve sonra geri atma işletmelerini basitleştirir.

Sahne işlemleri SceneSystem hizmeti tarafından dağıtılır, ancak herhangi bir görev tabanlı işlem, bir geçişi yönlendirmek için kullanılabilir.

Uzantıyı etkinleştirme

Uzantıyı etkinleştirmek için RegisteredServiceProvider profilinizi açın. Yeni bir yapılandırma eklemek için yeni bir hizmet sağlayıcısını Kaydet ' e tıklayın. Bileşen türü alanında, manzara hizmeti ' ni seçin. Yapılandırma profili alanında, uzantıya dahil edilen varsayılan sahne geçiş profilini seçin.

Profil seçenekleri

Varsayılan ilerleme göstergesini kullan

İşaretliyse, varsayılan ilerleme göstergesi ön cesi, bir ilerleme göstergesi nesnesi sağlandığında çağrılırken hiçbir ilerleme göstergesi nesnesi sağlanmadıysa kullanılacaktır DoSceneTransition. , varsayılan değer yok sayılır.

Zayıflatma rengi kullan

İşaretliyse, geçiş hizmeti geçişinizin sırasında bir belirme uygular. Bu ayar çalışma zamanında hizmetin özelliği aracılığıyla değiştirilebilir UseFadeColor .

Soldur rengi

Belirme efektinin rengini denetler. Alfa yok sayılır. Bu ayar, hizmetin özelliği aracılığıyla geçişten önce çalışma zamanında değiştirilebilir FadeColor .

Soldur hedefleri

Hangi kameraların bunlara uygulanan bir belirme efekti olacağını denetler. Bu ayar çalışma zamanında hizmetin özelliği aracılığıyla değiştirilebilir FadeTargets .

Ayar Hedeflenen kameralar
Ana Ana kameraya Soldur efektini uygular.
Kullanıcı arabirimi UI katmanındaki kameralara Silinme efekti uygular. (Kaplama Kullanıcı arabirimini etkilemez)
Tümü Hem ana hem de UI kameraları için geçerlidir.
Özel İle sunulan özel bir kamera kümesi için geçerlidir SetCustomFadeTargetCameras

Belirme süresi/silinme zamanı

Bir geçişe giriş/çıkış sırasında belirme süresi için varsayılan ayarlar. Bu ayarlar çalışma zamanında hizmetin FadeOutTime ve özelliklerin üzerinden değiştirilebilir FadeInTime .

Kamera fader türü

ICameraFaderKameralara Silinme efekti uygulamak için kullanılacak sınıf. Varsayılan CameraFaderQuad sınıf, hedef kameranın önünde klip düzlemine yakın bir saydam malzemeyle bir dörtlü oluşturur. Başka bir yaklaşım da bir sonrası etkileri sisteminin kullanılması olabilir.

Uzantıyı kullanma

Kamera kullanılırken çalıştırılan görevleri geçirerek geçiş hizmetini kullanırsınız.

Sahne sistem görevlerini kullanma

Çoğu durumda, SceneSystem hizmeti tarafından sağlanan görevleri kullanacaksınız:

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

Özel görevleri kullanma

Diğer durumlarda, bir sahneyi gerçekten yüklemeden geçiş yapmak isteyebilirsiniz:

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
}

Ya da SceneSystem hizmetini kullanmadan bir sahne yüklemek isteyebilirsiniz:

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

Birden çok görev kullanma

Ayrıca, sırasıyla yürütülecek birden çok görev da sağlayabilirsiniz:

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

İlerleme göstergesini kullanma

İlerleme göstergesi, arabirimini uygulayan her şey olur IProgressIndicator . Bu, bir giriş ekranı, 3B bir TagAlong yükleme göstergesi veya geçiş ilerlemesi hakkında geri bildirim sağlayan başka bir şey olabilir.

, UseDefaultProgressIndicator Manzara hizmeti profilinde işaretlenirse, bir geçiş başladığında bir ilerleme göstergesi örneği oluşturulur. Geçişin süresi boyunca bu göstergenin ve ProgressMessage özelliklerine bu hizmetin SetProgressValue ve yöntemlerin üzerinden erişilebilir SetProgressMessage .

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

Alternatif olarak, arama sırasında DoSceneTransition isteğe bağlı bağımsız değişken aracılığıyla kendi ilerleme göstergeyi sağlayabilirsiniz progressIndicator . Bu, varsayılan ilerleme göstergesini geçersiz kılar.