Unity、c#中的拓展方法讲解

时间:2024-08-25 10:34:32

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

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

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

不过需要注意几点:

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

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

Unity、c#中的拓展方法讲解
 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 }
Unity、c#中的拓展方法讲解

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

Unity、c#中的拓展方法讲解
 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 }
Unity、c#中的拓展方法讲解

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

Unity、c#中的拓展方法讲解
 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 }
Unity、c#中的拓展方法讲解

使用:

Unity、c#中的拓展方法讲解
 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#中的拓展方法讲解

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