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

大概的意思是这样的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. 前端构建大法 Gulp 系列 (四):gulp实战

    前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家 前 ...

  2. 让tomcat支持中文cookie

    这的确是一个不正常的需求,按照规范,开发者需要将cookie进行编码,因为tomcat不支持中文cookie. 但有时候,你不得不面对这样的情况,比如请求是由他人开发的软件,比如,浏览器控件发出的. ...

  3. 敏捷团队中的QA由来

    QA,全称为Quality Analyst,即质量分析师(有些称为Quality Assurance,即质量保证师).为什么它总跟质量扯在一块?感觉这个角色明明做的都是测试的事情,为什么不直接叫做te ...

  4. Entity Framework 6 Recipes 2nd Edition(11-12)译 -> 定义内置函数

    11-12. 定义内置函数 问题 想要定义一个在eSQL 和LINQ 查询里使用的内置函数. 解决方案 我们要在数据库中使用IsNull 函数,但是EF没有为eSQL 或LINQ发布这个函数. 假设我 ...

  5. Entity Framework 6 Recipes 2nd Edition(13-6)译 -> 自动编译的LINQ查询

    问题 你想为多次用到的查询提高性能,而且你不想添加额外的编码或配置. 解决方案 假设你有如Figure 13-8 所示的模型 Figure 13-8. A model with an Associat ...

  6. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  7. iOS 地图定位及大头针的基本使用

    地图 Part1 - 定位及大头针的基本使用 一.MapKit 作用 : 用于地图展示 如大头针,路线,覆盖层展示等(着重界面展示) 使用步骤 导入头文件 #import <MapKit/Map ...

  8. js变量声明作用域问题

    1.先来看两个题 var a = 1; foo1(); function foo1(){ console.log(a); //输出1 }; foo2(); var a = 1; function fo ...

  9. 常用js功能函数集合

    1.获取随机时间戳 function uniqueId(){         var a=Math.random,b=parseInt;         return Number(new Date( ...

  10. Linux驱动开发——pr_fmt的用法

    作者:彭东林 邮箱:pengdonglin137@163.com 在阅读kernel代码的时候,总是看到有很多驱动都在第一行定义pr_fmt,闲来没事,分析了一下, 发现,确实挺方便的.下面记录分享一 ...