Unity 场景淡入淡出效果

 一. 使用Dotween,建议使用我的方式

   FindObjectOfType<SceneFadeInAndOut>().FadeIn(() =>
        {
            Debug.Log("Fade in MenuStart Scene");
        });

using DG.Tweening;
using System;
using System.Numerics;
using UnityEngine;
using UnityEngine.UI;


public class SceneFadeInAndOut : MonoBehaviour
{
    #region 字段和属性的定义

    //渐变的速率
    public float m_fTime = 1f;

    //RawImage组件
    RawImage _rawImage;

    Color blackAlpha0 => new Color(0, 0, 0, 0);
    #endregion

    private void Awake()
    {
        _rawImage = FindObjectOfType<RawImage>();
    }


    void Update()
    {
        if (Input.GetKeyDown(KeyCode.I))
        {
            FadeIn(null);
        }

        if (Input.GetKeyDown(KeyCode.O))
        {
            FadeOut(null);
        }
    }

    /// <summary>
    /// 设置场景的淡入
    /// </summary>
    public void FadeIn(Action complete)
    {
        _rawImage.gameObject.SetActive(true);
        _rawImage.color = Color.black;
        _rawImage.DOColor(blackAlpha0, m_fTime).SetEase(Ease.InOutQuad).OnComplete(() =>
        {
            _rawImage.gameObject.SetActive(false);
            complete?.Invoke();
        });

    }

    /// <summary>
    /// 设置场景的淡出
    /// </summary>
    public void FadeOut(Action complete)
    {
        _rawImage.gameObject.SetActive(true);
        _rawImage.color = blackAlpha0;
        _rawImage.DOColor(Color.black, m_fTime).SetEase(Ease.InOutQuad).OnComplete(() =>
        {
            complete?.Invoke();
        });
    }

}

 二. https://www.cnblogs.com/MoRanQianXiao/p/7691790.html

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


public class SceneFadeInAndOut : MonoBehaviour
{

    #region 单例模式

    //设置静态的字段来模拟全局的变量(开始为空)
    private static SceneFadeInAndOut _instance = null;
    /// <summary>
    /// 只读属性的设置
    /// </summary>
    public static SceneFadeInAndOut Instance
    {
        get
        {
            //如果一开始的为空的话
            if (_instance == null)
            {
                //进行类的实例化的操作
                _instance = new SceneFadeInAndOut();
            }
            //下一个访问的话_instance就不为空直接返回字段
            return _instance;
        }
    }
    private SceneFadeInAndOut() { }

    #endregion

    #region 字段和属性的定义

    //渐变的速率
    public float floatColorChangeSpeed = 1f;
    //RawImage对象
    public GameObject goRawImage;
    //RawImage组件
    private RawImage _rawImage;
    //屏幕是否要逐渐清晰(默认是需要的)
    private bool _isSceneToClear = true;
    //屏幕是否需要逐渐变暗(默认是不需要的)
    private bool _isSceneToBlack = false;

    #endregion

    void Awake()
    {
        //如果goRawImage不为空的话
        if (goRawImage)
        {
            //得到RawImage组件
            _rawImage = goRawImage.GetComponent<RawImage>();
        }
    }
    void Update()
    {
        if (_isSceneToClear)
        {
            SceneToClear();
        }
        else if (_isSceneToBlack)
        {
            SceneToBlack();
        }

        if(Input.GetKeyDown(KeyCode.C))
        {
            SetSceneToClear();
        }

        if (Input.GetKeyDown(KeyCode.D))
        {
            SetSceneToBlack();
        }
    }

    #region 公共方法的定义

    /// <summary>
    /// 设置场景的淡入
    /// </summary>
    public void SetSceneToClear()
    {
        InitToBlack();

        _isSceneToClear = true;
        _isSceneToBlack = false;
    }

    /// <summary>
    /// 设置场景的淡出
    /// </summary>
    public void SetSceneToBlack()
    {

        _isSceneToClear = false;
        _isSceneToBlack = true;
    }

    #endregion

    #region 私有方法的定义

    /// <summary>
    /// 屏幕逐渐清晰(淡入)
    /// </summary>
    private void FadeToClear()
    {
        //插值运算
        _rawImage.color = Color.Lerp(_rawImage.color, Color.clear, floatColorChangeSpeed * Time.deltaTime);
    }

    /// <summary>
    /// 屏幕逐渐暗淡(淡出)
    /// </summary>
    private void FadeToBlack()
    {
        //插值运算
        _rawImage.color = Color.Lerp(_rawImage.color, Color.black, floatColorChangeSpeed * Time.deltaTime);
    }

    /// <summary>
    /// 屏幕的淡入
    /// </summary>
    private void SceneToClear()
    {
        FadeToClear();
        //当我们的a值小于等于0.05f的时候 就相当于完全透明了
        if (_rawImage.color.a <= 0.05f)
        {
            //设置为完全透明
            _rawImage.color = Color.clear;
            //组件的开关设置为关闭的状态
            _rawImage.enabled = false;
            //布尔条件设置为false
            _isSceneToClear = false;
        }
    }


    private void InitToBlack()
    {
        //组件的打开
        _rawImage.enabled = true;
        //设置为完全不透明的状态 
        _rawImage.color = Color.black;
        //布尔条件当到达指定的阿尔法值得时候设置为false
        _isSceneToBlack = false;
    }

    /// <summary>
    /// 屏幕的淡出
    /// </summary>
    private void SceneToBlack()
    {
        //组件的打开
        _rawImage.enabled = true;
        FadeToBlack();
        //当前的阿尔法值大于0.95f的时候 表示已经接近于完全不透明的状态
        if (_rawImage.color.a >= 0.95f)
        {
            //设置为完全不透明的状态 
            _rawImage.color = Color.black;
            //布尔条件当到达指定的阿尔法值得时候设置为false
            _isSceneToBlack = false;
        }
    }

    #endregion

}//class_end

猜你喜欢

转载自blog.csdn.net/qq_39097425/article/details/133135353
今日推荐