Unity:如何淡出场景几秒钟
Unity: how to fade away scene for few seconds
我正在编写一个简单的游戏,玩家必须在其中收集一些物品。我想做的是他收集一个物体后,场景消失几秒钟,然后玩家位置发生变化。
我知道如何改变位置,我不知道如何制作淡出效果。我尝试过使用图像效果(例如 Vortex 和 Blur),但我无法缓慢增加它们的变量(例如 Vortex 的角度值和模糊的模糊迭代),从而给人以动画的印象。
有人可以指导我完成这个吗?
您可以在场景中添加一个带有纹理的新对象,使其类似于全局蒙版。如果你想让淡入淡出效果下的场景只是黑色,那么填充黑色的小方形纹理就足够了,你可以适当缩放它以适合相机。
此 material 上的着色器应支持透明度,以便纹理的 alpha 层易于管理。
然后您可以使用 renderer.sharedMaterial.SetFloat() 方法从代码中操作 alpha 值。
像这样:
IEnumerator SetTransparencyLevel(bool fullyTransparent)
{
for (var i = renderer.material.GetFloat("Alpha"); fullyTransparent && i > 0 || !fullyTransparent && i < 1; i+=0.05f)
{
renderer.material.SetFloat("Alpha", i);
yield return new WaitForEndOfFrame();
}
}
我没有测试这段代码,但它指明了方向。
我最近一直在为一款实验性 2D 游戏做类似的事情。我发现最好的方法是使用一个非常简洁的免费库——LeanTween。您可以在普通游戏对象和 Unity UI 元素上使用它。这就是 fade-out 的样子。
LeanTween.alpha (gameObject, 0.0f, 1.0f);
第一个参数应该是你想要淡出的游戏对象,第二个是你想要的 alpha 值(0.0f 将完全淡出对象),最后一个是持续时间动画。
将 ScreenOverlay 图像效果添加到您的相机,将 BlendMode 设置为 ScreenBlend 并将 Intensity 设置为 0,然后添加以下脚本:
bool fading;
float fadeValue = 0;
const float INCREMENT = 0.01f;
const float MAX_BLEND = 2;
ScreenOverlay so;
void OnTriggerEnter(Collider other)
{
fading = true;
}
void Start()
{
so = gameObject.GetComponent<ScreenOverlay>();
}
void Update()
{
if (fading)
{
fadeValue += INCREMENT;
so.intensity = fadeValue * MAX_BLEND;
if (fadeValue >= 1)
{
fading = false;
// change player position
}
}
else if (fadeValue > 0)
{
fadeValue = Mathf.Max(0, fadeValue - INCREMENT);
so.intensity = fadeValue * MAX_BLEND;
}
}
要增加持续时间,只需将 INCREMENT
变小即可。
它非常适合我。
您还可以使用 CanvasGroup 并使用协程更改 alfa。我认为这是一个简单的方法。
这是我在游戏中所做的:
public class Fader : MonoBehaviour {
private CanvasGroup _canvasGroup;
private Coroutine _currentActiveFade;
private void Awake() {
_canvasGroup = GetComponent<CanvasGroup>();
}
public void FadeOutImmediately() => _canvasGroup.alpha = 1;
public Coroutine FadeOut(float time) => Fade(1, time);
public Coroutine FadeIn(float time) => Fade(0, time);
private Coroutine Fade(float target, float time) {
if (_currentActiveFade != null) StopCoroutine(_currentActiveFade);
_currentActiveFade = StartCoroutine(FadeRoutine(target, time));
return _currentActiveFade;
}
private IEnumerator FadeRoutine(float target, float time) {
while (!Mathf.Approximately(_canvasGroup.alpha, target)) {
_canvasGroup.alpha = Mathf.MoveTowards(_canvasGroup.alpha, target, Time.deltaTime / time);
yield return null;
}
}
}
我正在编写一个简单的游戏,玩家必须在其中收集一些物品。我想做的是他收集一个物体后,场景消失几秒钟,然后玩家位置发生变化。
我知道如何改变位置,我不知道如何制作淡出效果。我尝试过使用图像效果(例如 Vortex 和 Blur),但我无法缓慢增加它们的变量(例如 Vortex 的角度值和模糊的模糊迭代),从而给人以动画的印象。
有人可以指导我完成这个吗?
您可以在场景中添加一个带有纹理的新对象,使其类似于全局蒙版。如果你想让淡入淡出效果下的场景只是黑色,那么填充黑色的小方形纹理就足够了,你可以适当缩放它以适合相机。 此 material 上的着色器应支持透明度,以便纹理的 alpha 层易于管理。 然后您可以使用 renderer.sharedMaterial.SetFloat() 方法从代码中操作 alpha 值。
像这样:
IEnumerator SetTransparencyLevel(bool fullyTransparent)
{
for (var i = renderer.material.GetFloat("Alpha"); fullyTransparent && i > 0 || !fullyTransparent && i < 1; i+=0.05f)
{
renderer.material.SetFloat("Alpha", i);
yield return new WaitForEndOfFrame();
}
}
我没有测试这段代码,但它指明了方向。
我最近一直在为一款实验性 2D 游戏做类似的事情。我发现最好的方法是使用一个非常简洁的免费库——LeanTween。您可以在普通游戏对象和 Unity UI 元素上使用它。这就是 fade-out 的样子。
LeanTween.alpha (gameObject, 0.0f, 1.0f);
第一个参数应该是你想要淡出的游戏对象,第二个是你想要的 alpha 值(0.0f 将完全淡出对象),最后一个是持续时间动画。
将 ScreenOverlay 图像效果添加到您的相机,将 BlendMode 设置为 ScreenBlend 并将 Intensity 设置为 0,然后添加以下脚本:
bool fading;
float fadeValue = 0;
const float INCREMENT = 0.01f;
const float MAX_BLEND = 2;
ScreenOverlay so;
void OnTriggerEnter(Collider other)
{
fading = true;
}
void Start()
{
so = gameObject.GetComponent<ScreenOverlay>();
}
void Update()
{
if (fading)
{
fadeValue += INCREMENT;
so.intensity = fadeValue * MAX_BLEND;
if (fadeValue >= 1)
{
fading = false;
// change player position
}
}
else if (fadeValue > 0)
{
fadeValue = Mathf.Max(0, fadeValue - INCREMENT);
so.intensity = fadeValue * MAX_BLEND;
}
}
要增加持续时间,只需将 INCREMENT
变小即可。
它非常适合我。
您还可以使用 CanvasGroup 并使用协程更改 alfa。我认为这是一个简单的方法。
这是我在游戏中所做的:
public class Fader : MonoBehaviour {
private CanvasGroup _canvasGroup;
private Coroutine _currentActiveFade;
private void Awake() {
_canvasGroup = GetComponent<CanvasGroup>();
}
public void FadeOutImmediately() => _canvasGroup.alpha = 1;
public Coroutine FadeOut(float time) => Fade(1, time);
public Coroutine FadeIn(float time) => Fade(0, time);
private Coroutine Fade(float target, float time) {
if (_currentActiveFade != null) StopCoroutine(_currentActiveFade);
_currentActiveFade = StartCoroutine(FadeRoutine(target, time));
return _currentActiveFade;
}
private IEnumerator FadeRoutine(float target, float time) {
while (!Mathf.Approximately(_canvasGroup.alpha, target)) {
_canvasGroup.alpha = Mathf.MoveTowards(_canvasGroup.alpha, target, Time.deltaTime / time);
yield return null;
}
}
}