Aracılığıyla paylaş


Sahne geçiş hizmeti — MRTK2

Bu uzantı, bir sahneyi soluklama, ilerleme göstergesi görüntüleme, bir sahneyi yükleme ve sonra geri solma işini basitleştirir.

Sahne işlemleri SceneSystem hizmeti tarafından yönlendirilir, 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ı kaydet'e tıklayın. Bileşen Türü alanında SceneTransitionService'i 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

İşaretlenirse, bir DoSceneTransition. ilerleme göstergesi nesnesi sağlanırken ilerleme göstergesi nesnesi sağlanmazsa varsayılan ilerleme göstergesi ön adı kullanılır.

Soldurma rengini kullanma

İşaretlenirse, geçiş hizmeti geçişiniz sırasında soluk görüntülenir. Bu ayar çalışma zamanında hizmetin UseFadeColor özelliği aracılığıyla değiştirilebilir.

Soldurma rengi

Soldurma efektinin rengini denetler. Alfa yoksayılır. Bu ayar, hizmetin FadeColor özelliği aracılığıyla geçiş öncesinde çalışma zamanında değiştirilebilir.

Soldurma hedefleri

Hangi kameraların soldurma efektinin uygulanacağını denetler. Bu ayar çalışma zamanında hizmetin FadeTargets özelliği aracılığıyla değiştirilebilir.

Ayar Hedeflenen Kameralar
Ana Ana kameraya soldurma efekti uygular.
Kullanıcı arabirimi Kullanıcı arabirimi katmanındaki kameralara soluk efekti uygular. (Yer paylaşımı kullanıcı arabirimini etkilemez)
Tümü Hem ana hem de kullanıcı arabirimi kameraları için geçerlidir.
Özel Aracılığıyla sağlanan özel bir kamera kümesi için geçerlidir SetCustomFadeTargetCameras

Zaman sönme / zamanda solma

Geçişe girerken /geçişte solarak çıkma süresi için varsayılan ayarlar. Bu ayarlar çalışma zamanında hizmetin FadeOutTime ve FadeInTime özellikleri aracılığıyla değiştirilebilir.

Kamera fader türü

ICameraFader Kameralara soldurma efekti uygulamak için hangi sınıfın kullanılacağı. Varsayılan CameraFaderQuad sınıf, hedef kameranın önünde klip düzlemine yakın saydam bir malzemeyle dörtlü örneği oluşturur. Bir diğer yaklaşım da post effects sistemi kullanmak olabilir.

Uzantıyı kullanma

Kamera soluk görüntülenirken çalıştırılan Görevleri geçirerek geçiş hizmetini kullanırsınız.

Sahne sistemi görevlerini kullanma

Çoğu durumda SceneSystem hizmeti tarafından sağlanan Görevleri kullanırsı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, gerçekten bir sahne yüklemeden bir geçiş gerçekleştirmek 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
}

Veya 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ırayla yürütülecek birden çok görev de 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, arabirimi uygulayan IProgressIndicator her şeydir. Bu, bir giriş ekranı, bir 3B tagalong yükleme göstergesi veya geçiş ilerlemesi hakkında geri bildirim sağlayan herhangi bir şey olabilir.

SceneTransitionService profilinde işaretliyse UseDefaultProgressIndicator , bir geçiş başladığında ilerleme göstergesi örneği oluşturulur. Geçiş süresi boyunca bu göstergenin Progress ve Message özelliklerine söz konusu hizmetin SetProgressValue ve SetProgressMessage yöntemleri aracılığıyla erişilebilir.

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, çağırırken DoSceneTransition isteğe bağlı progressIndicator bağımsız değişken aracılığıyla kendi ilerleme göstergesini sağlayabilirsiniz. Bu, varsayılan ilerleme göstergesini geçersiz kılar.