問題背景
在使用unity開發過程中,通常會遇到一種情況,比如說給物體重新賦值坐標的問題,
Transfrom tran; float pos_x=1,pos_y=1,pos_z=1; tran.position=new Vector3(pos_x,pos_y,pos_z);
像這種情況,在開發中很繁瑣,多次使用,還有很多種情況,比如只設置X坐標,或者Y坐標,總這樣寫很麻煩,就萌生出一個想法,自己封裝一下吧,於是擴展方法出來了。
擴展方法定義
顧名思義,擴展方法就是擴展的方法,對應到面向對象中為一個類提供擴展方法,通俗來想,我們要或得到這個腳本然后增加成員來擴展方法的目的,但是這種情況在拿不到源代碼的情況下就無效了,
並且我們人為的去改變源代碼會破壞源代碼的穩定性,所以擴展方法就來了,一定有人在開發中用過DoTween這個插件,這個插件就是從iTween這個插件通過擴展方法這種實現方式來得,
在你使用時你會發現就像用原生函數一樣方便沒有任何插件的感覺。
擴展方法的特征
1.實現擴展方法的類必須是靜態類並且類的名稱和實現擴展方法的類無關
2.實現擴展方法的類方法必須是靜態方法
3.實現擴展方法的類方法的第一個參數必須是使用this關鍵字指明要實現擴展方法的類
具體代碼:
KuoZhanMethods.cs擴展方法腳本
using System.Collections; using System.Collections.Generic; using System.Text; using UnityEngine; public static class KuoZhanMethods { /// <summary> /// string轉int擴展方法(無參) /// </summary> /// <param name="str">第一個參數必須使用this關鍵字指定要使用擴展方法的類型</param> /// <returns></returns> public static int ToInt(this string str) { return int.Parse(str); } /// <summary> /// 設置物體X坐標(有參) /// </summary> /// <param name="tran">當前Transform</param> /// <param name="pos_x">X坐標</param> public static void SetPosition_X(this Transform tran,float pos_x) { tran.position = new Vector3(pos_x,tran.position.y,tran.position.z); } /// <summary> /// 設置物體Y坐標(有參) /// </summary> /// <param name="tran">當前Transform</param> /// <param name="pos_y">Y坐標</param> public static void SetPosition_Y(this Transform tran, float pos_y) { tran.position = new Vector3(tran.position.x, pos_y, tran.position.z); } /// <summary> /// 設置物體Z坐標(有參) /// </summary> /// <param name="tran">當前Transform</param> /// <param name="pos_z">Z坐標</param> public static void SetPosition_Z(this Transform tran, float pos_z) { tran.position = new Vector3(tran.position.x, tran.position.y,pos_z); } /// <summary> /// 設置物體坐標 /// </summary> /// <param name="tran">當前Tranfrom</param> /// <param name="pos_x">X坐標</param> /// <param name="pos_y">Y坐標</param> /// <param name="pos_z">Z坐標</param> public static void SetPosition_Pos(this Transform tran, float pos_x,float pos_y,float pos_z) { tran.position = new Vector3(pos_x, pos_y, pos_z); } /// <summary> /// 設置文本中字體顏色 /// </summary> /// <param name="str">當前字符串</param> /// <param name="colorValue">色值</param> /// <returns></returns> public static string ChangeTxtColor(this string str,string colorValue) { StringBuilder strB = new StringBuilder(); return strB.Append("<color=#").Append(colorValue).Append(">").Append(str).Append("</color>").ToString(); } }
KuoZhanMethodsText.cs測試腳本
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class KuoZhanMethodsText : MonoBehaviour { public Transform trans; public Text t; void Start () { //測試擴展方法string轉Int string s = "12346"; Debug.Log(s.ToInt()); //測試擴展方法設置自定義坐標 trans.SetPosition_X(-1); trans.SetPosition_Y(-1); trans.SetPosition_Z(-1); trans.SetPosition_Pos(-2, -2, -2); //測試擴展方法設置文本顏色 t.text = s.ChangeTxtColor("814c24"); } }
擴展方法使用的利弊:
使用擴展方法的好處是自由而任性地使用擴展方法對類進行擴展,而且擴展方法在Visual Studio中的智能提示會以藍色向下箭頭進行標識。
使用擴展方法的劣處是擴展方法在使用時應遵守就近原則,即在最小的范圍內使用擴展方法,對具體類而非抽象類實現擴展方法。使用擴展方法是因為在邏輯層需要這樣的功能,所以我們沒必要去改變抽象層的邏輯,因為這樣會破壞面向對象的開閉原則,“污染”整個代碼。舉一個簡單的例子,我們知道.NET中的基類是object,如果我們對這個類進行擴展,毫無疑問它會影響所有繼承自object的類,這樣就會造成“污染”,顯然在這使用是不明智的。
歡迎指正。