Scèneovergangsservice — MRTK2
Deze extensie vereenvoudigt het uitfaden van een scène, het weergeven van een voortgangsindicator, het laden van een scène en het weer vervagen.
Scènebewerkingen worden aangestuurd door de SceneSystem-service, maar elke taakgebaseerde bewerking kan worden gebruikt om een overgang aan te drijven.
De extensie inschakelen
Open het profiel RegisteredServiceProvider om de extensie in te schakelen. Klik op Een nieuwe serviceprovider registreren om een nieuwe configuratie toe te voegen. Selecteer ScèneTransitionService in het veld Type onderdeel. Selecteer in het veld Configuratieprofiel het standaardprofiel voor scèneovergang dat is opgenomen in de extensie.
Profielopties
Standaardvoortgangsindicator gebruiken
Als dit selectievakje is ingeschakeld, wordt de prefab van de standaardvoortgangsindicator gebruikt wanneer er geen voortgangsindicatorobject wordt opgegeven bij het aanroepen DoSceneTransition.
Van een voortgangsindicatorobject wordt de standaardwaarde genegeerd.
Kleur vervagen gebruiken
Als deze optie is ingeschakeld, past de overgangsservice een fade toe tijdens de overgang. Deze instelling kan tijdens runtime worden gewijzigd via de eigenschap van UseFadeColor
de service.
Kleur vervagen
Hiermee bepaalt u de kleur van het vervagingseffect. Alfa wordt genegeerd. Deze instelling kan worden gewijzigd tijdens runtime voorafgaand aan een overgang via de eigenschap van FadeColor
de service.
Doelen vervagen
Hiermee bepaalt u op welke camera's een vervagingseffect wordt toegepast. Deze instelling kan tijdens runtime worden gewijzigd via de eigenschap van FadeTargets
de service.
Instelling | Gerichte camera's |
---|---|
Belangrijkste | Hiermee past u een fade-effect toe op de hoofdcamera. |
Gebruikersinterface | Hiermee past u een fade-effect toe op camera's op de gebruikersinterfacelaag. (Heeft geen invloed op de overlay-gebruikersinterface) |
Alles | Is van toepassing op zowel hoofd- als UI-camera's. |
Aangepast telefoonnummer | Is van toepassing op een aangepaste set camera's die via SetCustomFadeTargetCameras |
Fade-out/faden in de tijd
Standaardinstellingen voor de duur van een vervaging bij het invoeren/afsluiten van een overgang. Deze instellingen kunnen tijdens runtime worden gewijzigd via de eigenschappen en FadeInTime
van FadeOutTime
de service.
Type camerafader
Welke ICameraFader
klasse moet worden gebruikt voor het toepassen van een fade-effect op camera's. Met de standaardklasse CameraFaderQuad
wordt een quad geïnstitueert met een transparant materiaal voor de doelcamera dicht bij het clipvlak. Een andere benadering is het gebruik van een post-effectensysteem.
De extensie gebruiken
U gebruikt de overgangsservice door taken door te geven die worden uitgevoerd terwijl de camera wordt uitgeschakeld.
Scènesysteemtaken gebruiken
In de meeste gevallen gebruikt u Taken die worden geleverd door de SceneSystem-service:
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")
);
}
Aangepaste taken gebruiken
In andere gevallen kunt u een overgang uitvoeren zonder een scène daadwerkelijk te laden:
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
}
U kunt ook een scène laden zonder de SceneSystem-service te gebruiken:
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();
}
}
Meerdere taken gebruiken
U kunt ook meerdere taken opgeven, die in volgorde worden uitgevoerd:
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;
}
De voortgangsindicator gebruiken
Een voortgangsindicator is alles waarmee de IProgressIndicator
interface wordt geïmplementeerd. Dit kan de vorm hebben van een welkomstscherm, een 3D tagalong-laadindicator of iets anders dat feedback geeft over de voortgang van de overgang.
Als UseDefaultProgressIndicator
is ingeschakeld in het profiel SceneTransitionService, wordt er een voortgangsindicator geïnstantieerd wanneer een overgang begint. Voor de duur van de overgang kunnen de eigenschappen van deze indicator Progress
en Message
worden geopend via de en methoden van SetProgressMessage
die serviceSetProgressValue
.
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();
}
}
Als u belt DoSceneTransition
, kunt u ook uw eigen voortgangsindicator opgeven via het optionele progressIndicator
argument. Hiermee wordt de standaardvoortgangsindicator overschreven.