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 ...
随机推荐
- Java基础(三)选择和循环结构
一.选择结构,条件判断 1.if 语句 一个 if 语句包含一个布尔表达式和一条或多条语句.如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码. impor ...
- Coherence 简介
Coherence是Oracle为了建立一种高可靠和高扩展集群计算的一个关键部件. 典型的使用Coherence的架构图是: Coherence被放在应用服务器和数据库服务器之间,从而解决通常应用 ...
- Java读取粘贴板内容
package com.test.jvm.oom.design; import java.awt.Image; import java.awt.Toolkit; import java.awt.dat ...
- JS里的居民们6-数组排序
编码 var arr = [43, 54, 4, -4, 84, 100, 58, 27, 140]; 将上面数组分别按从大到小以及从小到大进行排序后在console中输出 var arr = ['a ...
- sql server query to get the list of column name in a table
--SQL Server 2005, 2008 or 2012: SELECT * FROM information_schema.tables --SQL Server 2000: SELECT * ...
- 关于 class 的命名
class名称中只出现小写字符和破折号 使用有组织或目的明确的名称,不使用表现形式 基于最近的的父class 作为新class的前缀 使用 .js-* 来标识行为,并且不要将这些class包含到css ...
- Spring中无法访问resources目录下页面或静态资源
1.新建项目,在 resources 目录下创建 views 目录,在 views 目录下创建 index.html 页面,项目跑起来,浏览器访问页面,提示找不到页面之类的错误提示. 2.再尝试访问图 ...
- Codeforces Round #412 A Is it rated ?
A. Is it rated? time limit per test 2 seconds memory limit per test 256 megabytes Is it rated? Her ...
- 【小记录】关于dojo中的on事件
今天碰到一个现象,若是一个函数中存在一个on事件(例如点击事件),在该函数连续触发两次之后在去触发里面的on事件,会发现改时间所对应的函数被调用了两次,若父函数被连续触发N次后再取触发on事件,其对应 ...
- Python爬虫教程-25-数据提取-BeautifulSoup4(三)
Python爬虫教程-25-数据提取-BeautifulSoup4(三) 本篇介绍 BeautifulSoup 中的 css 选择器 css 选择器 使用 soup.select 返回一个列表 通过标 ...