问题背景
在使用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的类,这样就会造成“污染”,显然在这使用是不明智的。
欢迎指正。