很早以前看过这个东西,但是没有真正的用到过,希望之后会用到上面的方法,

大概的意思是这样的c#中尤其在用Unity的时候,已有的框架提供给我们一些固定的方法,但是有时我们想对这些方法进行修改,

这时我们就用到了拓展方法,也可以称为c#中的语法糖。

不过需要注意几点:

  • 类必须是static的,即静态类,但是不能继承MonoBehaviour类。
  • 静态类中的方法同样需要是static的。
  • 传入的参数需要有this修饰符修饰,如 public static void SetPositionX(this Transform trans){}
  • 如果写的拓展方法在一个命名空间中,在别的类用到的时候,需要引入命名空间,如 using Extends;

下面直接上代码,比较简单,明白意思即可。

 1 using UnityEngine;
2 using System.Collections;
3 namespace Extends {                                      //注意命名空间
4 public static class extendTransform {                         //静态类
5 public static void SetPositionX(this Transform trans, float x) {       //静态方法,注意this的位置
6 trans.position = new Vector3(x, trans.position.y, trans.position.z);
7 }
8 public static bool HaveZero(this Transform trans) {               //可以有返回值
9 return (trans.position==new Vector3(0,0,0));10 }
11 }
12 }

以上为拓展方法的定义代码,接下来是运用。

 1 using UnityEngine;
2 using System.Collections;
3 using Extends;                      //引入拓展方法命名空间
4 public class Test : MonoBehaviour {
5 public GameObject obj;
6 void Start () {
7 Debug.Log(obj.transform.position);
8 obj.transform.SetPositionX(10);        //直接调用方法
9 }
10 }

接下来粘贴一些从网上获取到的样例,帮助大家理解。具体作者不详。

 1 using UnityEngine;
2 using System.Collections;
3
4 public static class Extensions
5 {
6 public static void SetPositionX(this Transform t, float newX)
7 {
8 t.position = new Vector3(newX, t.position.y, t.position.z);
9 }
10
11 public static void SetPositionY(this Transform t, float newY)
12 {
13 t.position = new Vector3(t.position.x, newY, t.position.z);
14 }
15
16 public static void SetPositionZ(this Transform t, float newZ)
17 {
18 t.position = new Vector3(t.position.x, t.position.y, newZ);
19 }
20
21 public static float GetPositionX(this Transform t)
22 {
23 return t.position.x;
24 }
25
26 public static float GetPositionY(this Transform t)
27 {
28 return t.position.y;
29 }
30
31 public static float GetPositionZ(this Transform t)
32 {
33 return t.position.z;
34 }
35
36 public static bool HasRigidbody(this GameObject gobj)
37 {
38 return (gobj.rigidbody != null);
39 }
40
41 public static bool HasAnimation(this GameObject gobj)
42 {
43 return (gobj.animation != null);
44 }
45
46 public static void SetSpeed(this Animation anim, float newSpeed)
47 {
48 anim[anim.clip.name].speed = newSpeed;
49 }
50 }

使用:

 1 using UnityEngine;
2 using System.Collections;
3
4 public class Player : MonoBehaviour
5 {
6 void Update ()
7 {
8 float currentX = transform.GetPositionX();
9 transform.SetPositionX(currentX + 5f);
10 if(gameObject.HasRigidbody())
11 {
12 }
13 if(gameObject.HasAnimation())
14 {
15 gameObject.animation.SetSpeed(2f);
16 }
17 }
18 }

以后会不定期更新一些小的知识点,希望与大家共同提高。

Unity、c#中的拓展方法讲解的更多相关文章

  1. Unity添加自定义拓展方法

    Shepherdog|2014-04-08 10:50|16151次浏览|Unity(373)0 通常你会发现你不能修改正在使用的那些类,无论它是基础的数据类型还是已有框架的一部分,它提供的方法让你困 ...

  2. iOS7中UIView的animateKeyframesWithDuration方法讲解

    iOS7中UIView的animateKeyframesWithDuration方法讲解 在iOS7中,给UIView添加了一个方法用来直接使用关键帧动画而不用借助CoreAnimation来实现,那 ...

  3. Unity中自定义扩展方法

    问题背景 在使用unity开发过程中,通常会遇到一种情况,比如说给物体重新赋值坐标的问题, Transfrom tran: ,pos_y=,pos_z=; tran.position=new Vect ...

  4. Unity调用Android Studio中的Java方法

    1. 新建Unity项目: 2. Android Studio中新建EmptyActivity: 3. 新建安卓项目时记住最小版本号: 4. 将左侧项目文件浏览面板切换到Project项下,在本项根节 ...

  5. [原]unity中WWW isDone方法只能在主线程中调用

    项目中要使用动态加载,原计划是生成WWW对象后,放到一个容器里.由一个独立线程轮询容器里的对象,如果www.isDone为true时,回调一个接口把结果交给请求方. new Thread( new T ...

  6. 通俗的讲解Python中的__new__()方法

    2020-3-17更新本文,对本文中存争议的例子进行了更新! 曾经我幼稚的以为认识了python的__init__()方法就相当于认识了类构造器,结果,__new__()方法突然出现在我眼前,让我突然 ...

  7. C#中的匿名方法

    C#中的匿名方法是在C#2.0引入的,它终结了C#2.0之前版本声明委托的唯一方法是使用命名方法的时代.虽然在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方 ...

  8. Request中的各种方法

    前言 Request中方法众多,对于Java Web程序员来说,种种方法都会在工作中常常用到.Request由于不是JDK的一部分,这些方法的用法也没有专门的API可以查,所以在工作中遇到Reques ...

  9. 【转】Nginx服务器的反向代理proxy_pass配置方法讲解

    [转]Nginx服务器的反向代理proxy_pass配置方法讲解 转自:http://www.jb51.net/article/78746.htm 就普通的反向代理来讲Nginx的配置还是比较简单的, ...

随机推荐

  1. 【完全开源】知乎日报UWP版(上篇):界面设计、官方API分析

    目录 说明 使用Fiddler分析android版API 部分效果图 关于源码 说明 在做博客园UWP版的时候其实就有做知乎日报的打算了,前段时间一直出差,在酒店里用Fiddler简单的分析了一下An ...

  2. Windows平台Go调用DLL的坑

    最近的项目中,使用了GO来开发一些服务中转程序.业务比较简单,但是有一些业务需要复用原有C++开发的代码.而在WINDOWS,用CGO方式来集成C/C++代码并不是太方便.所以用DLL把C++的代码封 ...

  3. C++模板编程:如何使非通用的模板函数实现声明和定义分离

    我们在编写C++类库时,为了隐藏实现,往往只能忍痛舍弃模版的强大特性.但如果我们只需要有限的几个类型的模版实现,并且不允许用户传入其他类型时,我们就可以将实例化的代码放在cpp文件中实现了.然而,当我 ...

  4. ASP.NET Web API Model-ModelMetadata

    ASP.NET Web API Model-ModelMetadata 前言 前面的几个篇幅主要围绕控制器的执行过程,奈何执行过程中包含的知识点太庞大了,只能一部分一部分的去讲解,在上两篇中我们看到在 ...

  5. ASP.NET MVC Model绑定(四)

    ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容 ...

  6. Go语言实战 - revel框架教程之缓存和Job

    所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了.我知道一个PV过亿的站点就是全站静态(以前新浪也是), ...

  7. python学习 正则表达式

    一.re 模块中 1.re.match #从开始位置开始匹配,如果开头没有match()就返回none 语法:re.match(pattern, string, flags=0) pattern 匹配 ...

  8. Angular Service入门

    1.Angular内置service Angular为了方便开发者开发,本身提供了非常多的内置服务.可以通过https://docs.angularjs.org/api/ng/service查看Ang ...

  9. ECharts 初识(基于MVC+jQuery+Angularjs实现的Demo)

    一.背景:      我们这行做web开发的,很多时候都需要做数据统计报表,现在我所使用的是来自百度团队的ECharts.官方网址:http://echarts.baidu.com/      我们知 ...

  10. 【Data Cluster】真机环境下MySQL数据库集群搭建

    真机环境下MySQL-Cluster搭建文档  摘要:本年伊始阶段,由于实验室对不同数据库性能测试需求,才出现MySQL集群搭建.购置主机,交换机,双绞线等一系列准备工作就绪,也就开始集群搭建.起初笔 ...