Scene Transition Service (场景过渡服务)
该扩展简化了淡出场景,显示进度指示器,加载场景然后淡入的业务。
场景操作由SceneSystem服务驱动,但是任何基于任务的操作都可以用来驱动过渡操作。
Enabling the extension (启用扩展)
要启用扩展,请打开您的RegisteredServiceProvider配置文件。单击注册新服务提供者(Register a new Service Provider)以添加新配置。在“Component Type”字段中,选择“ SceneTransitionService”。在“Configuration Profile”字段中,选择default scene transition profile included with the extension。
配置文件选项
Use Default Progress Indicator (使用默认进度指示器)
如果选中,则在调用DoSceneTransition
时未提供任何进度指示器对象时,将使用默认进度指示器预制体。如果提供了进度指示器对象,则默认设置将被忽略。
Use Fade Color (使用淡入淡出)
如果选中,过渡服务将在过渡期间应用淡入淡出。可以在运行时通过服务的UseFadeColor
属性更改此设置。
Fade Color (淡入淡出颜色 )
控制淡入淡出效果的颜色。Alpha被忽略。可以在在运行时且过渡之前通过服务的FadeColor
属性更改此设置。
Fade Targets (淡入淡出目标)
控制将对它们应用淡入淡出效果的摄像机。可以在运行时通过服务的FadeTargets
属性更改此设置。
设置 | 目标相机 |
---|---|
Main | 对主相机应用淡入淡出效果。 |
UI | 将淡入淡出效果应用于UI层上的相机。(不影响覆盖UI) |
All | 适用于主摄像机和UI摄像机。 |
Custom | 适用于通过SetCustomFadeTargetCameras 提供的一组自定义摄像机 |
Fade Out Time / Fade In Time (淡出时间/淡入时间 )
进入/退出过渡时淡入淡出持续时间的默认设置。可以在运行时通过服务的FadeOutTime
和FadeInTime
属性更改这些设置
Camera Fader Type (相机淡入淡出类型)
使用哪个ICameraFader
类用于向相机应用淡入淡出效果。默认的CameraFaderQuad
类实例化一个quad,该quad在目标摄影机前面靠近剪切平面的位置使用透明材质。另一种方法可能是使用post effects系统。
Using the Extension (使用扩展)
您可以通过传递相机淡出时运行的任务来使用转换服务。
Using Scene System Tasks (使用场景系统任务)
在大多数情况下,您将使用SceneSystem服务提供的任务:
private async void TransitionToScene()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();
//淡出
//运行LoadContent任务
//淡入
await transition.DoSceneTransition(
() => sceneSystem.LoadContent("TestScene1")
);
}
使用自定义任务
在其他情况下,您可能想要执行淡入淡出而没有实际加载场景:
private async void TransitionToScene()
{
ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();
//淡出
//重置场景
//淡入
await transition.DoSceneTransition(
() => ResetScene()
);
}
private async Task ResetScene()
{
//遍历当前场景中的所有敌人并将它们移回起始位置
}
或者,您可能想加载场景而不使用SceneSystem服务:
private async void TransitionToScene()
{
ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();
//淡出
//使用Unity的场景管理器加载场景
//淡入
await transition.DoSceneTransition(
() => LoadScene("TestScene1")
);
}
private async Task LoadScene(string sceneName)
{
AsyncOperation asyncOp = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
while (!asyncOp.isDone)
{
await Task.Yield();
}
}
使用多个任务
You can also supply multiple tasks, which will be executed in order:
private async void TransitionToScene()
{
IMixedRealitySceneSystem sceneSystem = MixedRealityToolkit.Instance.GetService<IMixedRealitySceneSystem>();
ISceneTransitionService transition = MixedRealityToolkit.Instance.GetService<ISceneTransitionService>();
//淡出
//将时间刻度设置为0
//将音频淡入0
//加载TestScene1
//音频衰减为1
//将时间刻度设置为1
//淡入
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;
}
Using the Progress Indicator (使用进度指示器)
如果在SceneTransitionService配置文件中选中UseDefaultProgressIndicator
,则过渡开始时将实例化进度指示器。在过渡期间,可以通过该服务的SetProgressValue
和SetProgressMessage
方法访问该指标的Progress
和Message
属性。
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();
}
}
或者,在调用DoSceneTransition
时,您可以通过可选的progressIndicator
参数提供自己的进度指示器。这将覆盖默认进度指示器。