Unity 场景淡入淡出效果

2023-09-21 15:45:39

 一. 使用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

更多推荐

静态代理和动态代理

一、静态代理代理模式(ProxyPattern)是一种结构型设计模式,它的概念很简单,它通过创建一个代理对象来控制对原始对象的访问。代理模式主要涉及两个角色:代理角色和真实角色。代理类负责代理真实类,为真实类提供控制访问的功能,真实类则完成具体的业务逻辑。这样,当我们不方便或者不能直接访问真实对象时,可以通过代理对象来

Mysql----锁

文章目录锁概述全局锁全局锁概述全局锁操作表级锁表级锁表锁表级锁元数据锁表级锁意向锁行级锁行级锁行锁行级锁间隙锁&临键锁锁概述是什么是计算机协调多个进程或线程并发访问某一资源的机制。意义在数据库中,数据是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发

大数据之-Flink学习笔记

FlinkApacheFlink—数据流上的有状态计算。ApacheFlink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算处理。任何类型的数据都以事件流的形式生成。信用卡交易、传感器测量、机器日志或网站或移动应用程序2上的用户交互,所有这些数据都以流的形式生成。数据可以作为无界或有界流进行处理。无界

U盘格式化后数据能恢复吗?详细答案看这里!

“U盘格式化之后数据还可以恢复吗?这真的困扰了我好久!之前由于u盘中病毒,不得已将它格式化了,但是我还有好多视频、图片都保存在里面,这该怎么办呢?”小小的u盘,可是给我们带来了很多的便利的。在互联网时代,u盘的作用也是越来越大。但不否认的是,在使用u盘的过程中,我们也会遇到各种各样的问题,有时候我们不得已需要将u盘格式

基于PyTorch搭建FasterRCNN实现目标检测

基于PyTorch搭建FasterRCNN实现目标检测1.图像分类vs.目标检测图像分类是一个我们为输入图像分配类标签的问题。例如,给定猫的输入图像,图像分类算法的输出是标签“猫”。在目标检测中,我们不仅对输入图像中存在的对象感兴趣。我们还对它们在输入图像中的位置感兴趣。从这个意义上说,目标检测超越了图像分类。1.1图

Java实现敏感日志脱敏

一、前言在实际项目中,可能需要对日志中的一些敏感数据脱敏,比如使用遮掩算法,只显示部分数据。二、具体实现1.首先定义一个工具类,对常见的一些敏感数据脱敏publicclassDesensitizedUtils{/***【中文姓名】只显示第一个汉字,其他隐藏为2个星号,比如:李***/publicstaticString

Ubuntu 20.04中Nightingale二进制部署

参考博客《【夜莺监控】初识夜莺,强!》lsb_release-r可以看到操作系统版本是20.04,uname-r可以看到内核版本是5.5.19。sudoapt-getupdate进行更新镜像源。完成之后,如下图:sudoapt-getupgrade更新软件。MySQL安装参考博客《Ubuntu20.04安装MySQL8

Mojo编程语言是AI人工智能的新的编程语言

Mojo是ChrisLattner的创业公司Modular开发的一种新的编程语言,旨在统一AI基建和异构计算。Mojo被认为是Python的超集,兼容Python生态,但添加了系统编程和编译期优化的特性,以提高性能和部署效率。Mojo基于MLIR,可以支持多种硬件加速器,包括CPU、GPU和其他xPU。Mojo编程语言

Node.js环境安装与服务设置,结合内网穿透随时随地公网访问!

文章目录前言1.安装Node.js环境2.创建node.js服务3.访问node.js服务4.内网穿透4.1安装配置cpolar内网穿透4.2创建隧道映射本地端口5.固定公网地址前言Node.js是能够在服务器端运行JavaScript的开放源代码、跨平台运行环境。Node.js由OpenJSFoundation(原为

flutter产物以aar形式嵌入android原生工程

以前做的项目中,flutter都是作为module嵌入原生工程中,新公司项目却是以aar形式嵌入android工程,这种优点是原生工程不必配置flutter环境也能跑了,这里记录一下简单步骤。创建一个fluttermodule通过androidstudio创建一个fluttermodule,注意不要创建成flutter

KMP算法

卡尔老师视频链接KMP算法:KMP算法,全称为Knuth-Morris-Pratt算法,是一种用于字符串匹配的高效算法。它的主要思想是利用已经匹配过的字符信息,避免不必要的回溯,从而提高匹配的效率。KMP算法的核心是构建一个辅助数组next,用来记录模式串中每个字符对应的最长公共前缀和后缀的长度。通过这个数组,可以在匹

热文推荐