Scenövergångstjänst
Det här tillägget förenklar verksamheten med att tona ut en scen, visa en förloppsindikator, läsa in en scen och sedan tona in igen.
Scenåtgärder drivs av SceneSystem-tjänsten, men alla uppgiftsbaserade åtgärder kan användas för att driva en övergång.
Aktivera tillägget
Om du vill aktivera tillägget öppnar du din RegisteredServiceProvider-profil. Klicka på Registrera en ny tjänstleverantör för att lägga till en ny konfiguration. I fältet Komponenttyp väljer du SceneTransitionService. I fältet Konfigurationsprofil väljer du den standardprofil för scenövergång som ingår i tillägget.
Profilalternativ
Använd standard förloppsindikatorn
Om det här alternativet är DoSceneTransition.
markerat används standardförloppsindikatorn när inget förloppsindikator-objekt anges när ett förloppsindikatorsobjekt anropas. Om ett förloppsindikator-objekt anges ignoreras standardvärdet.
Använda tona färg
Om det här alternativet är markerat använder övergångstjänsten en toning under övergången. Den här inställningen kan ändras vid körning via tjänstens UseFadeColor
-egenskap.
Tona färg
Styr toningseffektens färg. Alfa ignoreras. Den här inställningen kan ändras vid körning före en övergång via tjänstens FadeColor
-egenskap.
Tona mål
Styr vilka kameror som ska ha en toningseffekt tillämpad på dem. Den här inställningen kan ändras vid körning via tjänstens FadeTargets
-egenskap.
Inställning | Riktade kameror |
---|---|
Main | Tillämpar toningseffekt på huvudkameran. |
UI | Tillämpar tonande effekt på kameror i UI-lagret. (Påverkar inte överläggsgränssnittet) |
Alla | Gäller för både huvud- och UI-kameror. |
Anpassat | Gäller för en anpassad uppsättning kameror som tillhandahålls via SetCustomFadeTargetCameras |
Tona ut tid/tona ned i tid
Standardinställningar för varaktigheten för en toning när en övergång ska skrivas in/avslutas. De här inställningarna kan ändras vid körning via tjänstens - och FadeOutTime
- FadeInTime
egenskaper.
Kamerakameratyp
Vilken ICameraFader
klass som ska användas för att tillämpa en toningseffekt på kameror. Standardklassen CameraFaderQuad
instansierar en quad med ett transparent material framför målkameran nära klippplanet. En annan metod kan vara att använda ett system för eftereffekter.
Använda tillägget
Du använder övergångstjänsten genom att skicka uppgifter som körs medan kameran tonas ut.
Använda scensystemuppgifter
I de flesta fall kommer du att använda uppgifter som tillhandahålls av SceneSystem-tjänsten:
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")
);
}
Använda anpassade uppgifter
I andra fall kanske du vill utföra en övergång utan att faktiskt läsa in en scen:
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
}
Eller så kanske du vill läsa in en scen utan att använda SceneSystem-tjänsten:
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();
}
}
Använda flera uppgifter
Du kan också ange flera uppgifter som ska köras i ordning:
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;
}
Använda förloppsindikatorn
En förloppsindikator är allt som implementerar IProgressIndicator
-gränssnittet. Detta kan ske i form av en välkomstskärm, en 3D-taggalong-inläsningsindikator eller något annat som ger feedback om övergångsförloppet.
Om UseDefaultProgressIndicator
är markerat i SceneTransitionService-profilen instansieras en förloppsindikator när en övergång påbörjas. Under övergångens varaktighet kan den här indikatorns Progress
Message
och egenskaperna nås via tjänstens - och SetProgressValue
- SetProgressMessage
metoder.
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();
}
}
Du kan också ange en egen DoSceneTransition
förloppsindikator via det valfria argumentet när du anropar progressIndicator
. Detta åsidosätter standardförloppets indikator.