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

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

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

不过需要注意几点:

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

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

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

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

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

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

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

使用:

  1. 1 using UnityEngine;
  2. 2 using System.Collections;
  3. 3
  4. 4 public class Player : MonoBehaviour
  5. 5 {
  6. 6 void Update ()
  7. 7 {
  8. 8 float currentX = transform.GetPositionX();
  9. 9 transform.SetPositionX(currentX + 5f);
  10. 10 if(gameObject.HasRigidbody())
  11. 11 {
  12. 12 }
  13. 13 if(gameObject.HasAnimation())
  14. 14 {
  15. 15 gameObject.animation.SetSpeed(2f);
  16. 16 }
  17. 17 }
  18. 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. 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  2. 玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理

    Windows服务Debug版本 注册 Services.exe -regserver 卸载 Services.exe -unregserver Windows服务Release版本 注册 Servi ...

  3. 修改策略组/注册表 屏蔽Win10升级解决方法

    一.Windows非家庭版 第1步:按Win+R键调出运行对话框,输入命令“gpedit.msc”,按回车键启动组策略编辑器. 第2步:依次定位到“计算机配置→管理模板→Windows组件→Windo ...

  4. Atitit.每月数据采集与备份 v4

    Atitit.每月数据采集与备份 v4 备份检查表 r12 00cate 00item im Inputmethod  ok ok Log Log ok cyar Cyar log  ... ok c ...

  5. 高性能JavaScript--快速响应的用户界面(简要学习笔记三)

    1.浏览器线程:用于执行JavaScript和更新用户界面的进程被称为“浏览器UI线程”.   2. <1>定时器的出现让出UI线程控制权 setTimeout(),setInterval ...

  6. JS中 call() 与apply 方法

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  7. Happy New Year 2016

    大学之前的时间都是按天来过的,期盼着一天一天地快快长大,期盼着过年穿新衣,阖家团聚,其乐融融: 大学的时间都是按周来过的,根据每周的课表周而复始,虽然单调但也是自由自在,简单充实: 刚工作的几年时间是 ...

  8. c 高级函数的简单用法

    c 中内置了很多高级的函数,我们先使用排序函数看一下 #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  9. JVM学习(3)——总结Java内存模型

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简 ...

  10. ASP.NET Core 整合Autofac和Castle实现自动AOP拦截

    前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...