【Unity】渐入渐出的黑屏(白屏)过场动画最简单的实现

一个简单的黑屏动画,用于2D项目,效果类似慢眨眼、进/出房间时切换场景的衔接过渡。

这种效果的实现方式其实蛮多的,我能想到的包括用shader,用一张全黑Sprite覆盖屏幕,或者直接做成一个UI。

(最近学了一些UnityShader,所以首先想到的方式是用画面“后处理”的方式写一个shader挂在Camera上,可以用公开的参数调节亮度,亮度降到0就是一个黑屏的效果。但不确定这种方式对于性能上是更优还是会增加额外的负担,所以还是舍弃了这种做法。)

这里记录一个最为简单的方式,就是用一张全黑的Sprite覆盖屏幕,将它挂在Camera下面。

因为在我当前的项目中,Camera是移动的,角色进入房间、离开房间回到场景时,使用黑屏动画过渡两个场景。挂在camera下面,就自动跟随Camera移动了,调出来的时候不需要额外去设置Position。(偷懒!)当然也可以不这么做:D

代码比较简单,优点是:渐入渐出的曲线形状、动画播放速度可以随意调节,而且主要代码就是十几行。

颜色也可以自行设置,黑屏白屏都可以。黑屏适合切换场景,白屏可以用做一些闪回之类的的效果。

先放代码,后面说明。

完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//黑屏,用一张全黑图片覆盖屏幕,调整透明度使用curve。
public class BlackScreen : MonoBehaviour
{
    public SpriteRenderer spriteRenderer;//覆盖屏幕的一张全黑图片,我选择挂在Camera下面,这样做如果相机是移动的就很方便
    public AnimationCurve curve; //在Inspector上调整自己喜欢的曲线
    [Range(0.5f, 2f)]public float speed = 1f; //控制渐入渐出的速度

    private void Awake()
    {
        if (spriteRenderer == null) 
            spriteRenderer = GetComponent<SpriteRenderer>();
    }

    //开启自动播放黑屏
    private void OnEnable()
    {
        StartCoroutine(Black());
    }

    Color tmpColor; //用于传递颜色的变量
    public IEnumerator Black()
    {
        float timer = 0f;
        tmpColor = spriteRenderer.color;
        do
        {
            timer += Time.deltaTime;
            SetColorAlpha(curve.Evaluate(timer * speed));
            yield return null;

        } while (tmpColor.a > 0);
        gameObject.SetActive(false);
    }

    //通过调整图片的透明度实现渐入渐出
    void SetColorAlpha(float a)
    {
        tmpColor.a = a;
        spriteRenderer.color = tmpColor;
    }
}

需要说明的点不多,就是通过调整黑屏图片的透明度来实现动画。

  • 用AnimationCurve 来自定义渐入渐出的曲线,Speed设置速度。

  • 用SetColorAlpha()方法用来设置全黑图片的透明度。

  • 在协程中做透明度的渐变,这里我直接把StartCoroutine(Black()) 放在OnEnable()中了(也是为了偷懒!),这样就可以平时隐藏黑屏对象,需要的时候直接SetActive它就会自动播放黑屏动画了。当然也可以把StartCoroutine(Black())放在一个公开的方法里,供外部随时调用。

对象

把脚本挂在空对象上,添加一个Sprite Renderer组件,用一张纯黑或纯白图片,大小调整为覆盖屏幕即可。如下:

  • Curve控制透明度0到1再回到0的动画节奏,可按需自行调节。

  • Speed可以控制播放的速度。

层级

在我的项目中,摄像机是移动的。为了方便随时可以播放黑屏动画,我把该对象挂在Camera下面,

设置为隐藏(GameObject.SetActive(false))。

需要播放黑屏动画时,SetActive(true)即可自动播放,播放完成将会再次隐藏。

猜你喜欢

转载自blog.csdn.net/yjy99yjy999/article/details/129262266