Unity中自定义扩展方法
问题背景
在使用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中自定义扩展方法的更多相关文章
- Unity中使用扩展方法解决foreach导致的GC
对于List这种顺序表,我们解决的时候还是可以使用for代替foreach即可.但是对于非顺序表,比如Dictionary或者Set之类,我们可以扩展方法Foreach,ForeachKey和Fore ...
- Jquery自定义扩展方法(二)--HTML日历控件
一.概述 研究了上节的Jquery自定义扩展方法,自己一直想做用jquery写一个小的插件,工作中也用到了用JQuery的日历插件,自己琢磨着去造个轮子--HTML5手机网页日历控件,废话不多说,先看 ...
- AbpVnext使用分布式IDistributedCache Redis缓存(自定义扩展方法)
AbpVnext使用分布式IDistributedCache缓存from Redis(带自定义扩展方法) 我的依赖包的主要版本以及Redis依赖如下 1:添加依赖 <PackageReferen ...
- C#3.0中的扩展方法
在实际应用中,开发者完成代码的编译后,除非重新编译更改后的代码,否则开发者很难在原有代码中添加新的功能. 在C#3.0中,提供了一个扩展方法的新特性,可以使得开发者在编译后的程序集里边添加相关的方法, ...
- 记录C#中的扩展方法
C#中的扩展方法. 系统自带的类型,我们无法去修改: 修改源代码需要较大的精力,而且可能会带来错误: 我们只是需要一个或者较少的几个方法,修改源代码费时费力: 被扩展的类是sealed的,不能被继承: ...
- C#编程(六十一)------------LINQ中的扩展方法
原文链接: http://blog.csdn.net/shanyongxu/article/details/47208401 LINQ中的扩展方法 LINQ中where扩展方法,要想使用,必须导入us ...
- objective-C中的扩展方法与partial class
在c#中要扩展一个现有类非常easy,比方这样: ? 1 2 3 4 5 6 7 public static class Utils { public static void PrintTo ...
- C#中的扩展方法(向已有类添加方法,但无需创建新的派生类型)
C#中的扩展方法 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样 ...
- Jquery自定义扩展方法(一)
jquery是一款流行的JS框架,自定义JS方法,封装到Jquery中,调用起来也挺方便的,怎么写Jquery扩展方法那,网上翻阅了一部分代码,其实也挺简单的: 方式一: (jQuery.fn.set ...
随机推荐
- 六、cent OS其它常用命令
进入根目录下的laycloud的目录cd /laycloud 进入当前目录下的目录cd laycloud 查看某个目录下的内容ls /laycloud 查看当前目录下的内容ls 查看当前目录下的内容读 ...
- Springboot简单整合Rabbit
两个项目.分别是生产者和消费者项目 .首先引入依赖.两边pom都一样 第一次练习,启动生产者后,再启动消费者,一直报找不到 队列的声明. 后排查发现是 需要现在生产者这边浏览器访问一次生产消息的方法 ...
- Web开发:Bootstrap的应用
- Collatz 序列、逗号代码、字符图网格
1.collatz序列 编写一个名为 collatz()的函数,它有一个名为 number 的参数.如果参数是偶数, 那么 collatz()就打印出 number // 2,并返回该值.如果 num ...
- Java泛型拾遗
先上百度百科的解释 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方 ...
- 《Java并发编程实战》读书笔记(一)----- 简介
简史 早期的计算机中不包含操作系统,从头至尾都只执行一个程序,并且这个程序能访问计算机所有资源.随着计算机发展,操作系统的出现,使得计算机可以同时运行多个程序,并且每程序都在单独的进程内运行.为什么要 ...
- 重构指南 - 分解复杂判断(Remove Arrowhead Antipattern)
当代码中有多层嵌套时,会降低代码的可读性,对于以后的修改也增加难度,所以我们需要分解复杂的判断并尽快返回. 重构前代码 public class Security { public ISecurity ...
- COGS2294 释迦
传送门 就是传说中的任意模数卷积嘛……有三模数NTT和拆系数FFT等做法,我比较懒不想动脑子,就用了三模数NTT的做法…… 卷积之后每个数可以达到$10^{23}$左右的级别,直接long doubl ...
- filter() 方法创建一个新数组
filter快速过滤创建一个新数组 var new_array = arr.filter(callback(element[, index[, array]])[, thisArg]) 参数节 cal ...
- Django—Cookie and Session
一.Cookie Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密). 1. 应用 服务器可以利用Co ...