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(问题集锦)之:The Apache Tomcat installation at this directory is version 8.5.32. A Tomcat 8.0 inst
最近开始学Java了.有C#底子,但是学起来Java还是很吃力,感觉别人架好了各种包,自己只要调用就行了,结果还有各种bug出现.掩面中. 启动Tomcat的时候,报错The Apache Tomca ...
- Spring Cloud个组件原理
引言 面试中面试官喜欢问组件的实现原理,尤其是常用技术,我们平时使用了SpringCloud还需要了解它的实现原理,这样不仅起到举一反三的作用,还能帮助轻松应对各种问题及有针对的进行扩展.以下是 课程 ...
- java web 之Session
1.Session简单介绍 由于Http是无状态的协议,所以服务端需要记录用户的状态时,就需要某种机制来识别具体的用户,实现这个机制的方式就是session. 典型的场景比如购物车,当你点击下单按钮时 ...
- CF Dima and Salad 01背包
C. Dima and Salad time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- java swing画图片爱心
第一次用swing做一个可视化程序,写第一篇随笔,有写的不好的地方请多多见谅.上个星期三在网上看到一个画爱心的软件,就想着自己用java也实现一个程序,画爱心用到的数学函数知识在网上百度的,不是本人原 ...
- Android源码下编译APK步骤
1.进入android源码目录下的build下执行:source envsetup.sh 后继续在该路径下执行lunch. 2.编写完成工程 3.编写Android.mk文件,放入工程目录下 ...
- shell编程之while死循环
原文 在linux下编程的程序猿都知道shell脚本,就算你不怎么熟悉,也应该听过的吧!那在shell脚本中的死循环该怎么写呢? 对于熟悉C语言的猿人们来说,最简单的死循环应该这样写: ------- ...
- Spring课程 Spring入门篇 5-5 advice应用(下)
2 代码演练 2.1 环绕通知(不带参数) 2.2 环绕通知(带参数) 2 代码演练 2.1 环绕通知(不带参数) 实体类: package com.imooc.aop.schema.advice.b ...
- C中的私有成员
skynet_context声明在.h里 但定义在.c里面 外部使用的时候无法用ctx->handle获取私有成员,会提示解引用类型错误 必须用.h里函数获取ctx里属性.
- elentment-ui解析
序言 现在前端的技术越来越杂,也越来越细了,以至于每次看完文档都会有个错觉,就是自己差不多会了.真正去做项目的时候又是重复之前的步骤. 之前写Java的时候,会习惯性的看看源码,看完之后会对知识掌握的 ...