• 浅谈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:
  • 相关阅读:
    进程、线程、处理器间的关系研究(未完待续)
    Java运行原理研究(未完待续)
    libuv的多线程之间传递消息
    C++对象与其第一个非静态成员地址相同
    libuv移植到android
    pthread在Qt+Windows下的使用
    libuv在mingw下编译
    libxml2在mingw下编译
    libcurl在mingw下编译
    string的内存本质
  • 原文地址:https://www.cnblogs.com/MoRanQianXiao/p/7691790.html
Copyright © 2020-2023  润新知