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的配置还是比较简单的, ...
随机推荐
- RavenDB官网文档翻译系列第一
本系列文章主要翻译自RavenDB官方文档,有些地方做了删减,有些内容整合在一起.欢迎有需要的朋友阅读.毕竟还是中文读起来更亲切吗.下面进入正题. 起航 获取RavenDB RavenDB可以通过Nu ...
- 玩转Windows服务系列汇总
玩转Windows服务系列汇总 创建Windows服务 Debug.Release版本的注册和卸载及其原理 无COM接口Windows服务启动失败原因及解决方案 服务运行.停止流程浅析 Windows ...
- angular view之间的数据传递
之前写过一篇backbone view之间的传递,由于现在在用angular搞开发,现在也来总结一下.在angular 传递数据通俗的讲叫做 广播 ,在一些文章中,也叫做事件的发布与订阅,在angul ...
- CodeSmith模板代码生成实战详解
前言 公司项目是基于soa面向服务的架构思想开发的,项目分解众多子项目是必然的.然而子项目的架子结构种类也过多的话,就会对后期的开发维护产生一锅粥的感觉.为了尽可能的在结构层避免出现这种混乱的现象,我 ...
- 【Win10 应用开发】使用“实时可视化树”工具查看应用界面元素
记得有朋友问老周,系统中的“计算器”应用的界面菜单是怎么做的.其实,你可以用VS 2015的新工具来查看它的界面结构. 实时可视化树工具只能查看XAML定义的界面,如WPF和Win App.现在,Wi ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(61)-如何使用框架来开发
系列目录 前言: 有些园友经常问如何正确快速开发,但是我告诉你没有什么帮助文档比自己动手做更加实在,不用代码生成器 这一节专门抽了些时间来非常非常详细演示这个框架的数据流,废话不多说,现在开始!下面看 ...
- Ajax 提交KindEditor的数据
这次我是在EasyUI中使用了KindEditor的编辑器,按照官方给的代码,总是无法获取编辑器里面的值(内容),如下: KindEditor.ready(function (K) { ...
- MAC终端命令行下用sublime、vscode、atom打开文件或目录
要知道,有时候一些小技巧,能极大的加大我们的工作效率. 在MAC下开发,用的最多的还是终端,我的终端环境是iterm2+ohmyzsh:步入正题前先给大家介绍几个小技巧: 第一个: 打开findle, ...
- .NET 实现并行的几种方式(四)
本随笔续接:.NET 实现并行的几种方式(三) 八.await.async - 异步方法的秘密武器 1) 使用async修饰符 和 await运算符 轻易实现异步方法 前三篇随笔已经介绍了多种方式.利 ...
- 用c-free 5写一个入门的程序
本文记录了在windows系统中使用C-FREE 5新建一个Hello HoverTree程序的步骤. 安装好C-Free 5之后,打开.新建一个工程: 附C-Free 5下载:http://hove ...