文章出處
文章列表
很早以前看過這個東西,但是沒有真正的用到過,希望之后會用到上面的方法,
大概的意思是這樣的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 }
以后會不定期更新一些小的知識點,希望與大家共同提高。
文章列表
全站熱搜