问题背景

在使用unity开发过程中,通常会遇到一种情况,比如说给物体重新赋值坐标的问题,

Transfrom tran;

float pos_x=,pos_y=,pos_z=;

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 = "";
Debug.Log(s.ToInt()); //测试扩展方法设置自定义坐标
trans.SetPosition_X(-);
trans.SetPosition_Y(-);
trans.SetPosition_Z(-);
trans.SetPosition_Pos(-, -, -); //测试扩展方法设置文本颜色
t.text = s.ChangeTxtColor("814c24");
}
}

扩展方法使用的利弊:

使用扩展方法的好处是自由而任性地使用扩展方法对类进行扩展,而且扩展方法在Visual Studio中的智能提示会以蓝色向下箭头进行标识。

使用扩展方法的劣处是扩展方法在使用时应遵守就近原则,即在最小的范围内使用扩展方法,对具体类而非抽象类实现扩展方法。使用扩展方法是因为在逻辑层需要这样的功能,所以我们没必要去改变抽象层的逻辑,因为这样会破坏面向对象的开闭原则,“污染”整个代码。举一个简单的例子,我们知道.NET中的基类是object,如果我们对这个类进行扩展,毫无疑问它会影响所有继承自object的类,这样就会造成“污染”,显然在这使用是不明智的。

欢迎指正。

Unity中自定义扩展方法的更多相关文章

  1. Unity中使用扩展方法解决foreach导致的GC

    对于List这种顺序表,我们解决的时候还是可以使用for代替foreach即可.但是对于非顺序表,比如Dictionary或者Set之类,我们可以扩展方法Foreach,ForeachKey和Fore ...

  2. Jquery自定义扩展方法(二)--HTML日历控件

    一.概述 研究了上节的Jquery自定义扩展方法,自己一直想做用jquery写一个小的插件,工作中也用到了用JQuery的日历插件,自己琢磨着去造个轮子--HTML5手机网页日历控件,废话不多说,先看 ...

  3. AbpVnext使用分布式IDistributedCache Redis缓存(自定义扩展方法)

    AbpVnext使用分布式IDistributedCache缓存from Redis(带自定义扩展方法) 我的依赖包的主要版本以及Redis依赖如下 1:添加依赖 <PackageReferen ...

  4. C#3.0中的扩展方法

    在实际应用中,开发者完成代码的编译后,除非重新编译更改后的代码,否则开发者很难在原有代码中添加新的功能. 在C#3.0中,提供了一个扩展方法的新特性,可以使得开发者在编译后的程序集里边添加相关的方法, ...

  5. 记录C#中的扩展方法

    C#中的扩展方法. 系统自带的类型,我们无法去修改: 修改源代码需要较大的精力,而且可能会带来错误: 我们只是需要一个或者较少的几个方法,修改源代码费时费力: 被扩展的类是sealed的,不能被继承: ...

  6. C#编程(六十一)------------LINQ中的扩展方法

    原文链接: http://blog.csdn.net/shanyongxu/article/details/47208401 LINQ中的扩展方法 LINQ中where扩展方法,要想使用,必须导入us ...

  7. objective-C中的扩展方法与partial class

     在c#中要扩展一个现有类非常easy,比方这样: ? 1 2 3 4 5 6 7 public static class Utils {     public static void PrintTo ...

  8. C#中的扩展方法(向已有类添加方法,但无需创建新的派生类型)

    C#中的扩展方法 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样 ...

  9. Jquery自定义扩展方法(一)

    jquery是一款流行的JS框架,自定义JS方法,封装到Jquery中,调用起来也挺方便的,怎么写Jquery扩展方法那,网上翻阅了一部分代码,其实也挺简单的: 方式一: (jQuery.fn.set ...

随机推荐

  1. .netcore2.0 发布CentOS7

    1.一般在windows pc上使用vscode 开发好.netcore 程序如果需要发布到其他平台需要注意一些事情 首先需要明白2个概念:FDD(Framework-dependent deploy ...

  2. redis(8)集群简介

    一.集群 互联网每天都会产生大量的数据,单实例已经不能满足需求.但是如果依赖于硬件成本的提升,那就不是所有人能够负担的起的. 集群这个时候出现,一定程度上解决了这个问题.它通过互联网,将多个单实例连接 ...

  3. dubbo配置清单-超详细版

    服务发布者 在服务发布者的springboot主配置文件application.properties中添加dubbo配置 #dubbo服务名 spring.dubbo.application.name ...

  4. jQuery Callback函数的用法

    在动画100%完成后,调用callback函数 语法如下 $(selector).hide(speed, callback); <!-- html部分 --> <button> ...

  5. Python基础-接口与归一化设计、抽象类、继承顺序、子类调用父类,多态与多态性

    一.接口与归一化设计 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 由 ...

  6. Android TabHost切换选项卡实现数据实时刷新

    手机界面大小有限,使用TabHost可以达到在一个Activity中放入多个容器(界面)的效果.但存在一个问题是,当数据信息在一个容器(界面)中有所改变时,需要在用户切换选项卡到其他容器(界面)的时候 ...

  7. 【Markdown】Latex基本语法

    Latex基本语法 注意点:Markdown 斜杠/ 转义字符! LaTeX 是大神Leslie Lamport 的杰作,该神是2013年图灵奖的获得者,感兴趣可以去瞻仰一下神人的相关著述: http ...

  8. C++模板详解(系转载,但是个人添加了一些内容)

    原文地址:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html 零.概述 模板是C++支持参数化多态的工具,使用模板可以使用户为类或 ...

  9. 小Y的轮回之路——攒机装机、B150装win7

    两个月前,陪伴我5年多的小Y(ideapad-y460N卡)突然大伤元气,硬盘跪了,显示屏也黑了一小块.本着经济实惠凑合用的态度换了个320G的硬盘,没想过几天显示屏情况加重,出现无数个红绿相间的线条 ...

  10. react native项目直接全局定义横竖屏幕

    这里指的是项目本身为横屏项目,直接全局设置,当然还有其他方法,使用react-native-orientation 全局定义如图: iOS android: