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的配置还是比较简单的, ...
随机推荐
- 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...
- 玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理
Windows服务Debug版本 注册 Services.exe -regserver 卸载 Services.exe -unregserver Windows服务Release版本 注册 Servi ...
- 修改策略组/注册表 屏蔽Win10升级解决方法
一.Windows非家庭版 第1步:按Win+R键调出运行对话框,输入命令“gpedit.msc”,按回车键启动组策略编辑器. 第2步:依次定位到“计算机配置→管理模板→Windows组件→Windo ...
- Atitit.每月数据采集与备份 v4
Atitit.每月数据采集与备份 v4 备份检查表 r12 00cate 00item im Inputmethod ok ok Log Log ok cyar Cyar log ... ok c ...
- 高性能JavaScript--快速响应的用户界面(简要学习笔记三)
1.浏览器线程:用于执行JavaScript和更新用户界面的进程被称为“浏览器UI线程”. 2. <1>定时器的出现让出UI线程控制权 setTimeout(),setInterval ...
- JS中 call() 与apply 方法
1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...
- Happy New Year 2016
大学之前的时间都是按天来过的,期盼着一天一天地快快长大,期盼着过年穿新衣,阖家团聚,其乐融融: 大学的时间都是按周来过的,根据每周的课表周而复始,虽然单调但也是自由自在,简单充实: 刚工作的几年时间是 ...
- c 高级函数的简单用法
c 中内置了很多高级的函数,我们先使用排序函数看一下 #include <stdio.h> #include <stdlib.h> #include <string.h& ...
- JVM学习(3)——总结Java内存模型
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 为什么学习Java的内存模式 缓存一致性问题 什么是内存模型 JMM(Java Memory Model)简 ...
- ASP.NET Core 整合Autofac和Castle实现自动AOP拦截
前言: 除了ASP.NETCore自带的IOC容器外,我们还可以使用其他成熟的DI框架,如Autofac,StructureMap等(笔者只用过Unity,Ninject和Castle). 1.ASP ...