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 ...
随机推荐
- [javaEE] 数据库连接池和动态代理
实现javax.sql.DataSource接口 实现Connection getConnection()方法 定义一个静态的成员属性LinkedList类型作为连接池,在静态代码块中初始化5条数据库 ...
- MongoDB 学习(一)安装配置和简单应用
一.安装和部署 1.服务端安装 1.官网下载(官方网站 https://www.mongodb.org/downloads/#production),傻瓜式安装,注意修改安装路径. 安装完成后的目录结 ...
- Python基础学习总结(五)
7.用户输入输出和while循环 1.使用函数 input() 输入,print() 打印,字符串可以用逗号隔开.end=' ' 关键字参数,打印时可以不换行,sep=‘ 你想要的分隔符 ’,关键字参 ...
- 数据上下文中的AddOrUpdate方法
AddOrUpdate是扩展方法,需要添加引用 using System.Data.Entity.Migrations;
- Docker简单说明
前段时间工作需要,简单的研究了下docker.侧重点放在docker的镜像定制方面,后续会研究下k8s的使用. Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的 ...
- Hello Activemq
0. 如果永远是localhost 可能一直low下去 1.下载安装 activemq 1.1 从官网下载activemq.tar.gz 并上传(rz)到linux系统 并解压 tar zxvf /* ...
- mysql 去除重复数据
1. 问题描述 有时load或者insert操作导致 表数据有重复 2. 解决方案 通过临时表.主键id.倒腾去重 示例 2.1 create table student( name varchar ...
- 使用dojo.connect()添加事件的注意事项
使用dojo.connect()添加事件处理器是很方便的,不用再考虑跨浏览器的问题了.但要想正确地使用这个方法,仍然要注意几个问题: 1.用dojo.byId()获取的是dom元素,而用 ...
- C# DataGridview转换为DataTable
如已绑定过数据源: DataTable dt = (dataGridView1.DataSource as DataTable) 如未绑定过数据源: public DataTable GetDgvTo ...
- HTML5+CSS3开发移动端页面
前提知识: 1.能够独立根据设计稿进行整套项目的需求.剖析及其开发: 2.对项目开发流程需要有一个基本的了解: 3.可以灵活运用切图.重构.前端的知识对项目进行灵活控制. 开发步骤之需求分析: 1.确 ...