C#重要知識點在遊戲開發中的應用

今天是大年初二,在此祝各位程序員朋友身體健康,豬年大吉。閒來無事,把在Unity開發中所使用的C#知識點總結了一下,因爲自己在帶團隊新人的時候,好多知識點它們並不是很清楚,編寫代碼還是侷限於“Hello World”的寫法,編寫能力一直遲遲得不到提高,另外,只是滿足於把分配的功能實現出來就完事了。自己對自己的能力也沒有一個清晰的認識,在這裏也是爲了能夠幫助他們,利用休息時間寫篇博客,其實在面試的時候,主考官也會問到相關的問題,在項目開發中這些知識點是必備的,掌握了這些知識點,再模塊化編程就容易多了。下面我把總結的給讀者展示一下:
在這裏插入圖片描述
C#作爲面嚮對象語言,面嚮對象語言的三大特性就是,繼承,封裝,多態。繼承就是子類繼承父類,有單繼承,多繼承,虛擬繼承等等。Unity它自己也爲我們提供了很多繼承的代碼,比如:
它的最頂層是Object,Component,Behaviour,MonoBehaviour,我們自己編寫的腳本要掛接到對象上就必須繼承MonoBehaviour。封裝主要是用於對外提供訪問的接口,避免直接修改內部數據。比如我們定義的變量,有兩種訪問方式:一種是直接訪問,另一種是將其放到函數中去獲取;第一種不安全會被修改,第二種是安全的,這也是我們說的接口封裝。多態,主要是函數的同名不同參。這三種特性是最基本的,必須要掌握的。

  • abstract class 抽象類

它是把物體的共性抽離出來,既可以把共性的方法實現出來,也可以提供子類實現的接口。它的優點是減少代碼量,但它不可以new對象。子類可以直接調用抽象類聲明的public函數。遊戲中比如我們的配置文件的加載讀取,舉例如下所示:
在這裏插入圖片描述這樣子類可以直接調用我們的Load函數,而子類具體實現OnLoad函數,如下所示:

在這裏插入圖片描述

  • partial類

有partial修飾的類,我們可以協同開發,換句話說,我們多個人可以共同寫一個類,如下所示:

在這裏插入圖片描述
這樣就避免了代碼衝突,而且根據功能分類比較清晰。

  • interface

只是提供接口,子類具體實現方法,在類的前面加上interface,在遊戲中使用的也是比較廣泛,示例如下所示:

在這裏插入圖片描述

  • template模板類

在遊戲中經常使用比如我們加載不同的配置文件,每個配置文件有自己的類結構體,需要具體實現,這樣就非常適合使用模板函數解決問題,還有增加組件,也適用於模板等等。當然模板也適合用於模板類,比如我們的單例模板,管理類模板等等。其實Unity它自身的類也大量使用了模板函數,在項目中舉個簡單的例子,如下所示:

在這裏插入圖片描述
where表示的是條件限制,new表示的必須要有無參數的構造函數。

  • delegate委託

類似C++中的指針,是一種回調函數。委託是比較常用的,比如我們的UI中使用的Button等響應事件都可以用委託,還有事件監聽也常用delegate等等,這個比較常用就不舉例子了。

  • attribute

在遊戲項目中也經常使用,attribute,Attribute本質上就是一個類,它附着在目標對象上最終實例化,attribute實例化也是有自己的特點:
第一、不通過new操作符來產生實例,而是使用在方括號裏調用構造方法來產生實例。
第二、方括號必須緊挨着放置在被附着目標的前面。
第三、不能使用對象初始化器給對象的屬性(Property)賦值,必須使用含參構造方法對Attribute實例中的屬性賦值。
詳情可以參考網址:https://docs.microsoft.com/en-us/dotnet/api/system.attribute?redirectedfrom=MSDN&view=netframework-4.7.2

我們說的用ILRuntime進行熱更新同樣可以使用Attribute幫助我們解決,下面介紹我們在項目中的應用,我們使用的是自定義屬性,注意必須繼承System.Attribute。
在這裏插入圖片描述
在上面中的方括號中使用的AttributeUsage就是屬性的設置,繼續我們自定義的實現,這個是具體實現了。如下所示:

在這裏插入圖片描述
我們自定義的屬性寫完了如何使用了,截取一段代碼給讀者簡單的展示一下,代碼類似如下所示:

      component = (Component)Activator.CreateInstance(type); 
      aAwakeSystem = this.awakeSystems[component.GetType()];  
      IAwake iAwake = aAwakeSystem as IAwake; 
      iAwake.Run(component);

我們還可以將其打包成dll庫,這樣就可以做到熱更新了。

  • Action和Func
    這兩個函數也是委託,只是它是C#內置的委託,Action不返回任何值,Func是返回值的。它兩種使用方式我們經常在場景加中使用。在項目中的應用如下所示:

在這裏插入圖片描述

    public void DownloadResources(Action<List<string>> downloadComplete, Action<int, int, float> downloadProgress, Func<string, bool> filter, params string[] resources)
    {
        DownloadResources(downloadComplete, downloadProgress, filter, false, resources);
    }

前面代碼使用了Action不帶參數,後面使用了Action帶參數的以及Func帶參數的。我們將其應用在資源下載,最終在程序中的調用如下所示:
在這裏插入圖片描述

  • 總結
    以上所列知識點,都是在項目中經常使用的,在這裏並沒有詳細的介紹,MSDN幫助文檔介紹的很詳細,如果讀者不是很清楚可以自行查閱,在這裏只是介紹了遊戲中利用這些知識點幫助我們解決問題,需要開發者熟練掌握。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章