淺談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
}

 

五:這樣就可以在別的腳本上進行調用了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM