浅谈Unity淡入淡出的效果的实现

Unity淡入淡出的效果的实现

 

前言:在我们的许多的游戏中,我们在游戏的开始的时候会有一个淡入的效果(场景由黑逐渐变清晰),当我们切换场景的时候(会由清晰逐渐的变黑的一个过程).

 

自己的思考:因为我们在许多的游戏中都有可能用到我们的淡入淡出的效果,所有就可以把它封装成一个类,每次当我们需要用到的时候,就可以直接拿来用了,这也体现我们我们c#的封装的特性。

 

实现的思路:

 

                     一.因为当我们封装好一个类的时候,那么我们 考虑如何会调用它呢??这时候我们会考虑使用单例模式。

 

                       单例模式的实现思路:

 

                                                          (1):我们使用静态字段来模拟全局变量。

 

                                                          (2):构造函数的私有化,因为我们不允许 别人通过使用new的关键字来创建类的实例,这也就保证了我们当前类只能有一个实例,来避免一些不必要的麻烦。

 

                                                          (3):得到实例。

 

 

 

单例模式的具体的实现:

 

 1         //设置静态的字段来模拟全局的变量(开始为空)
 2         private static SceneFadeInAndOut _instance = null;
 3         /// <summary>
 4         /// 只读属性的设置(得到实例)
 5         /// </summary>
 6         public static SceneFadeInAndOut Instance
 7         {
 8             get
 9             {
10                 //如果一开始的为空的话
11                 if (_instance == null)
12                 {
13                     //进行类的实例化的操作
14                     _instance = new SceneFadeInAndOut();
15                 }
16                 //下一个访问的话_instance就不为空直接返回字段
17                 return _instance;
18             }
19         }
20         //构造函数的私有化
21         private SceneFadeInAndOut() { }

 

 二:好的,当我们写完单例模式的时候,接下来要考虑显示的事情了,我们需要时候来进行显示呢???我们需要使用UGUI的RawImage组件,来控制Color来控制淡入淡出效果。

       请看截图:

 

 代码如下:

 1         //RawImage对象
 2         public GameObject goRawImage;
 3         //RawImage组件
 4         private RawImage _rawImage;
 5         void Awake()
 6         {
 7             //如果goRawImage不为空的话
 8             if (goRawImage)
 9             {
10                 //得到RawImage组件
11                 _rawImage = goRawImage.GetComponent<RawImage>();
12             }
13         }

 三:这时候需要控制组件来实现屏幕的淡入和淡出了。(颜色插值API自补)。

       方法为私有的,因为我们不要再别的类中调用,只在类中自己使用。

代码实现如下:

 1         //渐变的速率
 2         public float floatColorChangeSpeed = 1f;
 3         /// <summary>
 4         /// 屏幕逐渐清晰(淡入)
 5         /// </summary>
 6         private void FadeToClear()
 7         {
 8             //插值运算
 9             _rawImage.color = Color.Lerp(_rawImage.color, Color.clear, floatColorChangeSpeed * Time.deltaTime);
10         }
11 
12         /// <summary>
13         /// 屏幕逐渐暗淡(淡出)
14         /// </summary>
15         private void FadeToBlack()
16         {
17             //插值运算
18             _rawImage.color = Color.Lerp(_rawImage.color, Color.black, floatColorChangeSpeed * Time.deltaTime);
19         }
20 
21         /// <summary>
22         /// 屏幕的淡入
23         /// </summary>
24         private void SceneToClear()
25         {
26             FadeToClear();
27             //当我们的a值小于等于0.05f的时候 就相当于完全透明了
28             if (_rawImage.color.a <= 0.05f)
29             {
30                 //设置为完全透明
31                 _rawImage.color = Color.clear;
32                 //组件的开关设置为关闭的状态
33                 _rawImage.enabled = false;
34                 //布尔条件设置为false
35                 _isSceneToClear = false;
36             }
37         }
38 
39         /// <summary>
40         /// 屏幕的淡出
41         /// </summary>
42         private void SceneToBlack()
43         {
44             //组件的打开
45             _rawImage.enabled = true;
46             FadeToBlack();
47             //当前的阿尔法值大于0.95f的时候 表示已经接近于完全不透明的状态
48             if (_rawImage.color.a >= 0.95f)
49             {
50                 //设置为完全不透明的状态 
51                 _rawImage.color = Color.black;
52                 //布尔条件当到达指定的阿尔法值得时候设置为false
53                 _isSceneToBlack = false;
54             }
55         }

 四:那我们就接下来考虑如何调用淡入的方法   如何调用淡出的方法???

       1.设置两个布尔类型的条件,屏幕是否需要逐渐变清晰     屏幕是否需要变暗淡。

       2.编写两个公共的方法,当场景需要淡入的时候 分别的设置布尔条件就可以了。

       3.这样就可以在Update里面进行调用了。

 

代码实现如下:

 1         //屏幕是否要逐渐清晰(默认是需要的)
 2         private bool _isSceneToClear = true;
 3         //屏幕是否需要逐渐变暗(默认是不需要的)
 4         private bool _isSceneToBlack = false;
 5         void Update()
 6         {
 7             if (_isSceneToClear)
 8             {
 9                 SceneToClear();
10             }
11             else if (_isSceneToBlack)
12             {
13                 SceneToBlack();
14             }
15         }
16         /// <summary>
17         /// 设置场景的淡入
18         /// </summary>
19         public void SetSceneToClear()
20         {
21             _isSceneToClear = true;
22             _isSceneToBlack = false;
23         }
24 
25         /// <summary>
26         /// 设置场景的淡出
27         /// </summary>
28         public void SetSceneToBlack()
29         {
30             _isSceneToClear = false;
31             _isSceneToBlack = true;
32         }

全部代码实现如下:

/**
*    Title:"":项目
*          主题 :
*    Description:
*          功能:场景的淡入淡出的效果
*    Date:2017.10.12
*    Version:Unity5.5.4
*    Modify Recoder:
*    Operator:
*
**/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace Gnome
{
    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();
            }
        }

        #region 公共方法的定义

        /// <summary>
        /// 设置场景的淡入
        /// </summary>
        public void SetSceneToClear()
        {
            _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;
            }
        }

        /// <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
}

五:这样就可以在别的脚本上进行调用了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

{/*background:url("https://images.cnblogs.com/cnblogs_com/Candies/632934/o_o_light2.png") no-repeat 10px 50%;*/background:url("https://images.cnblogs.com/cnblogs_com/Candies/632934/o_may.png")no-repeat 20px 40%;margin-top: 20px;padding: 10px 10px 10px 120px;box-shadow: 0px 0px 15px #aaa;border-radius:
原文地址:https://www.cnblogs.com/MoRanQianXiao/p/7691790.html