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 }
五:這樣就可以在別的腳本上進行調用了。
