我们在使用Uinty开发时,有时候有函数提供的方法并不能直接满足我们的需求,可能需要多些很多行代码或者封装一个函数去处理我们的需求,这样会使我们的代码更加的臃肿,而且复用性还需要根据需求的不同去更改我们封装的函数。
这时候如果我们去扩展一个自定义的方法来提高我们的工作效率记忆代码的复用率,我们将不用去可以的调用任何一个函数就可以达到我们想要的方法,可以直接在类里面实现。
MSDN上,对扩展方法的定义如下:
“扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。”
基本使用方法:
基本使用方法就是创建一个静态类,在this的关键字后面跟上我们想要扩展的类,这样这个类的所有对象都可以使用此方法 。
下面我将举出几个例子来对部分方法进行扩展。
(一)扩展字典Dictionary
在使用Unity的时候我们经常会用到字典Dictionary,当我们想通过字典的key去找value时,只能通过TryGetValue中的out去获取到想要得到的value,总感觉不是很方便,先上一段代码:
private Dictionary<int, string> dic = new Dictionary<int, string>();
private void GetDicValue()
{
//当我们想通过字典的key去找value时,只能通过TryGetValue中的out去获取到想要得到的value,总感觉不是很方便
dic.TryGetValue(0, out string getStr);
}
这时候我们可以自己创建一个脚本Extension类去扩展我们的Dictionary,代码如下:
public static class Extension
{
public static Tvalue GetVaule<Tkey, Tvalue>(this Dictionary<Tkey, Tvalue> dic, Tkey key)
{
dic.TryGetValue(key, out Tvalue value);
return value;
}
}
private Dictionary<int, string> dic = new Dictionary<int, string>();
private void GetDicValue()
{
//当我们想通过字典的key去找value时,只能通过TryGetValue中的out去获取到想要得到的value,总感觉不是很方便
dic.TryGetValue(0, out string getStr);
//通过扩展我们的Dictionary,我们可以直接从dic中去获取并直接返回我们的Value
string str = dic.GetValue(0);
}
(二)扩展我们Transform
我相信大家在做开发的过程中肯定会用到transform.position = new Vector3(transform.position.x, 1, transform.position.z);这样类似的代码去移动我们的组件。
但是有时候我们可能仅仅需要移动我们组件的单轴坐标,这时候我们要么去生命一个新的Vector3去储存我们transform的位置,要么就是像我上面写的一样,总感觉一点都不大气上档次。
这时候我们可以选择去扩展我们的Transform去让我们得代码不这么臃肿。先贴一段扩展方法的代码(同样放在我们的Extension里):
public static void SetPos_X(this Transform transform, float x)
{
transform.position = new Vector3(x, transform.position.y, transform.position.z);
}
public static void SetPos_Y(this Transform transform, float y)
{
transform.position = new Vector3(transform.position.x, y, transform.position.z);
}
public static void SetPos_Z(this Transform transform, float z)
{
transform.position = new Vector3(transform.position.x, transform.position.y, z);
}
这样就分别扩展了我们transform.position的x、y、z的坐标。使用方法如下:
private void ChangePos()
{
//常用改变物体坐标的方法
transform.position = new Vector3(x, transform.position.y, transform.position.z);
//或者
Vector3 vec = transform.position;
transform.position = new Vector3(x, vec.y, vec.z);
//扩展后改变物体坐标的方法
transform.SetPos_X(x);
transform.SetPos_Y(y);
transform.SetPos_Z(z);
}
这样扩展了之后是不是代码也显得不是那么的臃肿,复用性也非常的强。这种方法也同样适用于更改物体的大小也就是transform.localScale
写在最后:
本文只是很简单的举了扩展方法的几个例子。在实际开发过程中,我们可以根据项目需求 、自己的开发需求去一直增加我们的扩展类,如果遇到好的方便的扩展方法我也会继续更新本文。