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 }

以后会不定期更新一些小的知识点,希望与大家共同提高。

时间: 2024-11-04 07:43:47

Unity、c#中的拓展方法讲解的相关文章

Unity添加自定义拓展方法

Shepherdog|2014-04-08 10:50|16151次浏览|Unity(373)0 通常你会发现你不能修改正在使用的那些类,无论它是基础的数据类型还是已有框架的一部分,它提供的方法让你困苦不堪.不过..C# 提供了一种巧妙的方式来让你扩充已有的类,也就是我们今天要讲的扩展方法. 扩展方法由于很方便而被经常使用到,我们更愿意叫他语法糖豆(syntactic sugar),一个实用样例是Unity的Transform类,比如:你只想设置Transform.position中Vector

JQ中的clone()方法与DOM中的cloneNode()方法

JQ中的clone()方法与DOM中的cloneNode()方法 cloneNode()定义和用法 cloneNode()方法创建节点的拷贝,并返回该副本. 语法: node.cloneNode(deep);  其接收一个可选参数"deep",为布尔类型,默认是false. 当设置为true,克隆当前节点,属性及当前节点的后代.若设置为false,仅仅克隆当前元素节点本身. 扩展:  使用cloneNode()方法,当被克隆的节点绑定了事件处理程序,事件处理程序是否会被一同克隆,这个我

[译]如何在Unity编辑器中添加你自己的工具

在这篇教程中你会学习如何扩展你的Unity3D编辑器,以便在你的项目中更好的使用它.你将会学习如何绘制你自己的gizmo,用代码来实现创建和删除物体,创建编辑器窗口,使用组件,并且允许用户撤销他们所作出的任何动作,这些全部都是用编辑器脚本来实现的. 这篇教程假设你已经熟悉Unity的基本工作流程.如果你知道如何在编辑器中创建物体.预设.场景并且知道如何移动它们,知道如何添加组件,那么你可以开始本教程的学习了. 最终结果预览 让我们看一下我们做出的最终结果是什么样子: 如你所见,我们会创建一个编辑

JQuery拓展方法之表单数据转Object—从而ajax post到后台

其实今天的分享很简单,只要你简单了解Jq拓展方法,只要你会遍历元素,那就能自己封装出来.在工作中正是因为有了一个个这样的方法,大大提升了我们的工作效率,减小了失误次数.但是我们往往又经常使用别人封装好的方法,这就很不爽了. 希望热爱技术的园友们今后都能做一个,自己封装方法,给整个公司用的人. ; (function ($) { $.fn.extend({ formToObj: function () { var data = new Object(); $("input[type=text],i

拓展方法

经常会看到以下形式的代码: var persons = new List<Person>() { new Person() { IQ = 100 }, new Person() { IQ = 200 } };persons.Where(p => p.IQ > 120).ToList().ForEach(p =>{    //Console.WriteLine(p.IQ);}); 注意这里 persons.Where 中的 Where,当去掉 using System.Linq

.net通过控制台演示一个简单的拓展方法

1.拓展方法是一种特殊的静态方法 2.拓展方法必须在静态类中定义 3.拓展方法的优先级必须低于同名的类方法 4.拓展方法只能在特定的命名空间有效 5.除非必要不要滥用扩展方法 namespace ConsoleApplication1{    class Program     {       static void Main(string[] args)       { //扩展方法          string s = "asdasdas";          Console.W

反射 DataTable拓展方法 转实体对象、实体集合、JSON

Mapper类 using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace CommonHelper { public class Mapper { public

JS中通过call方法实现继承

讲解都写在注释里面了,有不对的地方请拍砖,谢谢! <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>JS通过call方法实现继承</title> </head> <body> <script type="text/javascript"> /* js中的继承有多种实现方式,今天我们讨论下通过call方法实现的继承. 此

maven项目执行main方法讲解

项目中有时候会遇到执行main函数来测试类中所写的方法.普通的java程序在eclipse中执行非常简单,对要执行的java类,run as 即可编译运行,查看结果. 但是使用maven管理项目,对于maven项目还按照原来的方式就行不通了.下面讲解下如何在maven项目中执行main函数. 一.  maven项目执行main函数方法,需引入两个插件:maven-compiler-plugin和exec-maven-plugin插件. maven-compiler-plugin :用于编译jav