[C#/Unity] 如何寫擴展方法(Extension Methods)提高開發效率

        擴展方法(Extension Methods)是對現有的數據類型實現一些自定義的操作的方法。善用擴展方法能有效地提高開發效率,減少很多冗餘的代碼。就我自己而言,其中一個最大的用途莫過於在Unity的使用上,對Vector3、Vector2、Color等數據類型進行更便捷的變換。

        在一般情況下,這類數據類型的變換的代碼都會顯得非常多餘。比如我想對物體的當前Position的Z軸增加10,我是不可以直接:

transform.position.z += 10;

        而必須:

transform.position = new Vector3(transform.position.x, transform.position.y, transform.position.z + 10);

        這樣一個簡單的變換,都要寫一段這麼長的代碼,費時費力,但只要對Vector3寫一個擴展方法,一切都會變得簡單很多。

擴展方法的具體寫法

一、首先創建一個靜態類

        public static class ExtensionMethods{ }

    

二、定義一個靜態方法(我在這裡就以Vector3類型用於快捷修改z值的擴展方法為例)

        public static class ExtensionMethods

        {

                public static Vector3 Z(){ }

        }

    

三、定義方法需要的形參

        public static class ExtensionMethods

        {

                public static Vector3 Z(this Vector3 value, float z){ }

        }

       *this Vector3 value 這個參數是使用時自動傳值的,代表著使用這個擴展方法的Vector3數據。比如transform.position.Z,那這裡的value就是transform.position自身。

       *後面的float z就是具體想改變的目標值了

    

四、最後就是編寫具體的函數體了(這裡以快捷修改z值為例)

        public static class ExtensionMethods

        {

                public static Vector3 Z(this Vector3 value, float z)

                {

                        Vector3 newValue = value;

                        newValue.z = z;

                        return newValue;

                }

        }

    

五、這樣寫完之後,就可以通過以下這種簡潔的方法對位置信息進行修改了

        transform.position = transform.position.Z(transform.position.z + 10);

一點總結

        上面修改Vector3 z值只是一個很簡單的例子,除了Vector3這些unity特有的數據類型以外,int、float、string等等基本的C#數據類型也可以通過上面的步驟寫一些提高開發效率的擴展方法。

        擴展方法實際上並沒有提高運行的效率,就結果而言,仍然是new了一個Vector3,然後賦值,再返回出去,但是只要有了這個shortcut,就能重覆使用,大幅提高寫代碼的效率。其實這種將重覆的工作抽象出來,封裝成一個方法,從而提高代碼的複用性,也是我們做面向對象編程時的一個核心思想。