Unity、c#中的拓展方法讲解
很早以前看过这个东西,但是没有真正的用到过,希望之后会用到上面的方法,
大概的意思是这样的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#中的拓展方法讲解的更多相关文章
- Unity添加自定义拓展方法
Shepherdog|2014-04-08 10:50|16151次浏览|Unity(373)0 通常你会发现你不能修改正在使用的那些类,无论它是基础的数据类型还是已有框架的一部分,它提供的方法让你困 ...
- iOS7中UIView的animateKeyframesWithDuration方法讲解
iOS7中UIView的animateKeyframesWithDuration方法讲解 在iOS7中,给UIView添加了一个方法用来直接使用关键帧动画而不用借助CoreAnimation来实现,那 ...
- Unity中自定义扩展方法
问题背景 在使用unity开发过程中,通常会遇到一种情况,比如说给物体重新赋值坐标的问题, Transfrom tran: ,pos_y=,pos_z=; tran.position=new Vect ...
- Unity调用Android Studio中的Java方法
1. 新建Unity项目: 2. Android Studio中新建EmptyActivity: 3. 新建安卓项目时记住最小版本号: 4. 将左侧项目文件浏览面板切换到Project项下,在本项根节 ...
- [原]unity中WWW isDone方法只能在主线程中调用
项目中要使用动态加载,原计划是生成WWW对象后,放到一个容器里.由一个独立线程轮询容器里的对象,如果www.isDone为true时,回调一个接口把结果交给请求方. new Thread( new T ...
- 通俗的讲解Python中的__new__()方法
2020-3-17更新本文,对本文中存争议的例子进行了更新! 曾经我幼稚的以为认识了python的__init__()方法就相当于认识了类构造器,结果,__new__()方法突然出现在我眼前,让我突然 ...
- C#中的匿名方法
C#中的匿名方法是在C#2.0引入的,它终结了C#2.0之前版本声明委托的唯一方法是使用命名方法的时代.虽然在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方 ...
- Request中的各种方法
前言 Request中方法众多,对于Java Web程序员来说,种种方法都会在工作中常常用到.Request由于不是JDK的一部分,这些方法的用法也没有专门的API可以查,所以在工作中遇到Reques ...
- 【转】Nginx服务器的反向代理proxy_pass配置方法讲解
[转]Nginx服务器的反向代理proxy_pass配置方法讲解 转自:http://www.jb51.net/article/78746.htm 就普通的反向代理来讲Nginx的配置还是比较简单的, ...
随机推荐
- 【初探Spring】------Spring IOC(二):初始化过程---简介
首先我们先来看看如下一段代码 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultList ...
- [转载]:STM32为什么必须先配置时钟再配置GPIO
转载来源 :http://blog.csdn.net/fushiqianxun/article/details/7926442 [原创]:我来添两句,就是很多同学(包括我)之前搞低端单片机,到了stm ...
- (转载)解决“Windows Update一直无法完成”的方法
近日彻底重装系统,启动Win7的"Windows Update",程序显示在检查更新,却一直没有结果. 在排除网络问题,排除杀毒软件和防火墙的问题之后,感觉还是程序或者配置除了问题 ...
- LINQ系列目录
1. LINQ准备 1.1 C#中与LINQ相关特性 2. LINQ to Object 2.1 LINQ to Object投影操作符(Select/SelectMany/Let) 2.2 LINQ ...
- jQuery全局Ajax事件处理器
1. .ajaxComplete( handler(event, XMLHttpRequest, ajaxOptions) ) 每当一个Ajax请求完成,jQuery就会触发ajaxComplete ...
- AngularJS开发指南11:AngularJS的model,controller,view详解
model model这个词在AngularJS中,既可以表示一个(比如,一个叫做phones的model,它的值是一个包含多个phone的数组)对象,也可以表示应用中的整个数据模型,这取决于我们所讨 ...
- 坎坷路:ASP.NET Core 1.0 Identity 身份验证(中集)
上一篇:<坎坷路:ASP.NET 5 Identity 身份验证(上集)> ASP.NET Core 1.0 什么鬼?它是 ASP.NET vNext,也是 ASP.NET 5,以后也可能 ...
- Hibernate(3)——实例总结Hibernate对象的状态和ThreadLoacl封闭的session
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: Hibernate的内部执行过程(CRUD) 对象的状态及其转换图和例子 使用JUnit测试 使用getCur ...
- SQL Server索引视图以(物化视图)及索引视图与查询重写
本位出处:http://www.cnblogs.com/wy123/p/6041122.html 经常听Oracle的同学说起来物化视图,物化视图的作用之一就是可以实现查询重写,听起来有一种高大上的感 ...
- Android立体旋转动画实现与封装(支持以X、Y、Z三个轴为轴心旋转)
本文主要介绍Android立体旋转动画,或者3D旋转,下图是我自己实现的一个界面 立体旋转分为以下三种: 1. 以X轴为轴心旋转 2. 以Y轴为轴心旋转 3. 以Z轴为轴心旋转--这种等价于andro ...