问题背景

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

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

扩展方法使用的利弊:

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

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

欢迎指正。

原文:https://www.cnblogs.com/answer-yj/p/10794327.html

Unity自定义扩展方法相关推荐

  1. my97DatePicker 自定义扩展方法(实现备忘录)

    昨天在经理安排下,提出一个需求,显示出日历,并在日历上显示特殊日期,当鼠标移动至此日期时,弹出div,显示当天具体的操作信息.在网上与园子里查找一段时间,并没有准确的demo,所以无奈只有自己研究,二 ...

  2. 让你觉得破坏了封装性的扩展方法

    扩展方法源于对扩展方法的了解是来自List<T>的Where.Order.GroupBy等方法的使用,智能感知提示这些方法都是扩展方法,于是MSDN上查阅后总结如下自定义扩展方法(将字符串 ...

  3. jquery的扩展方法介绍

    最近一直在写js,这其中也少不了一位js的主角了jQuery,下面介绍的是jQuery的一些扩展,也就是jQuery的扩展方法,jQuery的扩展方法有两种方式,一种是jQuery本身的扩展方法,另一 ...

  4. Unity常用的一些简易扩展方法

    Unity常用的一些简易扩展方法 引言 在unity项目的日常开发中,会发现unity现有的一些类的方法不是特别够用,但有些方法使用频率又很高,这时候,我们就可以用到Extension Method ...

  5. Unity学习笔记--Extension Method 扩展方法

    引言 最近跟着麦克学习Unity的时候,学习到了类的扩展方法.比如你现在有一个已有的类,你想给它加一个方法,当然如果是你自己写的类可以直接在这个方法里面写,但是如果是Unity自带的类,我们不可能直接 ...

  6. class ts 扩展方法_JUnit 5自定义扩展

    前言 在org.junit.jupiter.api.extension包下,JUnit5提供了丰富的扩展接口,通过实现这些接口,我们可以定制自己的扩展并注册到JUnit中来实现功能扩展. Extens ...

  7. EFCore3.1+编写自定义的EF.Functions扩展方法

    前言 本文主要是讲解EF Core3.0+ 如何实现自定义的数据库扩展函数,虽然EF.Functions 提供了很多数据库函数,但是并不全面.比如加密解密...这样的话 我们就需要自己扩展这些数据库函 ...

  8. C#高级编程——C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)——图文详解加源码

    C#高级编程--C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)--图文详解加源码 前言

  9. 【Unity】Unity开发进阶(七)双刃剑:扩展方法

    文章目录 扩展方法 扩展方法声明 如何使用 举个例子 基本原则 扩展方法的优劣分析 总结 扩展方法 C#在3.0版本中引入了"扩展方法",既有静态方法的优点,又使调用它们的代码的可 ...

最新文章

  1. 机器学习入门:K-近邻算法
  2. 下载 golang.org/x 包出错不用代理的解决办法
  3. 金属的特性只是一种状态
  4. 【XML】XML元素属性详解
  5. SqlBulkCopy批量插入数据库
  6. 小程序 | 微信小程序from报名表单提交至数据库(含js提交函数)
  7. [转] 外企面试官最爱提的问题 TOP10
  8. IOS div上下滑动效果
  9. Java 8 新的时间日期库java.time
  10. How-to: Tune Your Apache Spark Jobs (Part 1)
  11. php 保护图片地址,如何使用PHP正确保护图片上传?
  12. 正反向数据库及生成设计报告
  13. 一年级学python_Python这个黑科技,后悔没有早点学起来
  14. 过拟合 准确率大幅下降_梯度下降和过拟合和归一化
  15. C# 将Big5繁体转换简体GB2312的代码
  16. [转]出现蓝屏代码stop ** 0x000000a5(0x00000001,0x89758d98,0x000000000,0x00000000)
  17. Fetcher failure for URL: ‘gitsm://github.com/Xilinx/qemu.git;protocol=https petalinux build 问题
  18. 人工智能方向毕业设计_本科生的毕业论文如果选择人工智能相关方向,需要注意哪些问题...
  19. 基于linux用C语言编写的局域网通信软件(在ubuntu上正常运行)
  20. 跟我学AngularJs:AngulaJs开发技巧汇总(持续更新)

热门文章

  1. 环评图件制作 (生态影响评价)项目区位置图、工程平面图、调查样方样线点位断面等布设图、土地利用现状图、地表水系图、植被类型图、植被覆盖度图、归一化植被指数图、生态系统类型图、土壤侵蚀图、物种适宜生境图
  2. cad无法加载arx文件_CAD文件无法打开,这两点原因你必须要知道
  3. 如何下载不同格式的卫星地图
  4. erlang nif 测试
  5. DPDK之什么是imissed、ierrors、rx_nombuf
  6. 为什么所有公司OA系统都很难用?
  7. MES制造执行系统8大的关键数据,你造吗?
  8. 操作系统_05_调度算法(个人总结)
  9. Stata+Atom: 强强联手打造编辑利器
  10. TimerTask 的使用