团结:如何淡出场景几秒钟

本文关键字:几秒 淡出 何淡出 团结 | 更新日期: 2023-09-27 18:29:36

我正在编程一个简单的游戏,玩家必须在其中收集一些对象。我想做的是,在他收集到一个物体后,场景会消失几秒钟,然后改变玩家的位置。

我知道如何改变位置,我不知道如何产生渐隐效果。我尝试过使用图像效果(如Vortex和Blur),但我无法慢慢增加它们的变量(例如Vortex的角度值和模糊的模糊迭代),这样会给人一种动画的印象。

有人能帮我渡过难关吗?

团结:如何淡出场景几秒钟

将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即可。它非常适合我。

您可以在场景中添加一个带有纹理的新对象,使其类似于全局遮罩。如果您希望渐变效果下的场景是简单的黑色,那么填充黑色的小方块纹理就足够了,您可以适当缩放它,使其适合相机。该材质上的着色器应该支持透明度,以便纹理的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元素上使用它。这就是淡出的样子。

LeanTween.alpha (gameObject, 0.0f, 1.0f);

第一个参数应该是你想要淡出的游戏对象,第二个参数是你想要的alpha值(0.0f将完全淡出对象),最后一个参数是动画的持续时间。

您也可以使用CanvasGroup并使用Coroutines更改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;
            }
        }
    }