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.