Unity3D如何有效地組織代碼
來源:
未知 |
責任編輯:六月芳菲 |
發(fā)布時間: 2018-03-05 11:37 | 瀏覽量:
更多精彩教程:http://windermere-rat-removal.com/resource/
準確地說,代碼作為Unity項目里的一種資源,此問題應該擴展到如何組織Unity資源。簡單說說我們的經(jīng)驗:
- Unity有一些自身的約定,譬如項目里的Editor,Plugins等目錄作為編輯器,插件目錄等等。知名的插件會自己存放一個目錄,譬如NGUI等。
所以我們自己的代碼,一般目錄名會以下劃線開頭,譬如 "_Scripts", "_Prefabs"等。
對于場景,文檔等目錄,用兩條下劃線,以便他們能排在最頂部。
- 代碼用C#,別用JS。必要的話用namespace將自己的代碼括起來。我們是用namespace把自己積攢的公用庫包住。
- C#的注釋要認真寫,打///就能幫你補全了,沒理由偷懶。
- 每個程序文件開頭要用一段注釋寫修改Log,誰改過什么簡單留一條說明。就算用了Unity的版本管理或者Git,那些log終究會丟失,只有認真把log寫在代碼里,才會有意識去認真優(yōu)化它。
- Unity的腳本邏輯,就功能而言大體分為兩種,一種是比較獨立的,譬如爆炸之后1秒鐘消失,這種單獨寫個腳本綁定到目標上即可。
更多的是腳本里與其它的腳本進行交互。Unity里提供了一種萬金油的方法是SendMessage, 這種方法性能略差,如果你調(diào)用的頻率不高,隨便用也無妨。另一種方法是直接通過對象的實例去調(diào)用。
我們的做法是寫幾個公用的控制器,讓它們各司其職,負責各自的事情:
- 寫一個一個GlobalManager.cs來控制游戲的全局變量及全局方法。靜態(tài)類模式。譬如當前玩到第幾大關第幾小關,玩家的金幣數(shù)量等。
- 寫一個GameController.cs來控制當前關的游戲進程。單實例模式。游戲的主循環(huán)也是用它控制。初始化,勝利、失敗判定等等。
- 寫一個InputController.cs來控制所有的用戶輸入。單實例模式。鼠標、鍵盤、觸摸屏,我們做游戲是保證同時支持這三種輸入的,因為大部分時間是在PC上測試。
關于GameController與InputController的聯(lián)系,有點讓人糾結(jié)。一般來講是在InputContoller里調(diào)用GameController.Instance.Foo()執(zhí)行方法?;蛘咧苯訉nput寫成Listener的模式,讓GameController去監(jiān)聽。
- 其它的類似菜單控制器,聲音控制器,成就控制器,IAP虛擬道具控制器等等,也是采用類似的方法管理。
- 關于PlayerPref的操作,統(tǒng)一寫成靜態(tài)類的get/set模式,程序中哪里要用則直接讀寫。
- 如果你的項目里場景的數(shù)量少(<5),那么拖入場景的資源可以很隨意。如果場景數(shù)量很多(幾十個,有的解謎游戲每個關卡就是一個場景),那么拖入場景的prefab數(shù)量一定要少。
- 設計你的prefab資源里,你要想像當其他人拿到這些資源,是否直接拖入一個空場景里就能run,頂多再簡單設置幾下。如果你設計的資源不能做到這些,那么得好好重新想想。
更多精彩教程:http://windermere-rat-removal.com/resource/
準確地說,代碼作為Unity項目里的一種資源,此問題應該擴展到如何組織Unity資源。簡單說說我們的經(jīng)驗:
- Unity有一些自身的約定,譬如項目里的Editor,Plugins等目錄作為編輯器,插件目錄等等。知名的插件會自己存放一個目錄,譬如NGUI等。
所以我們自己的代碼,一般目錄名會以下劃線開頭,譬如 "_Scripts", "_Prefabs"等。
對于場景,文檔等目錄,用兩條下劃線,以便他們能排在最頂部。
- 代碼用C#,別用JS。必要的話用namespace將自己的代碼括起來。我們是用namespace把自己積攢的公用庫包住。
- C#的注釋要認真寫,打///就能幫你補全了,沒理由偷懶。
- 每個程序文件開頭要用一段注釋寫修改Log,誰改過什么簡單留一條說明。就算用了Unity的版本管理或者Git,那些log終究會丟失,只有認真把log寫在代碼里,才會有意識去認真優(yōu)化它。
- Unity的腳本邏輯,就功能而言大體分為兩種,一種是比較獨立的,譬如爆炸之后1秒鐘消失,這種單獨寫個腳本綁定到目標上即可。
更多的是腳本里與其它的腳本進行交互。Unity里提供了一種萬金油的方法是SendMessage, 這種方法性能略差,如果你調(diào)用的頻率不高,隨便用也無妨。另一種方法是直接通過對象的實例去調(diào)用。
我們的做法是寫幾個公用的控制器,讓它們各司其職,負責各自的事情:
- 寫一個一個GlobalManager.cs來控制游戲的全局變量及全局方法。靜態(tài)類模式。譬如當前玩到第幾大關第幾小關,玩家的金幣數(shù)量等。
- 寫一個GameController.cs來控制當前關的游戲進程。單實例模式。游戲的主循環(huán)也是用它控制。初始化,勝利、失敗判定等等。
- 寫一個InputController.cs來控制所有的用戶輸入。單實例模式。鼠標、鍵盤、觸摸屏,我們做游戲是保證同時支持這三種輸入的,因為大部分時間是在PC上測試。
關于GameController與InputController的聯(lián)系,有點讓人糾結(jié)。一般來講是在InputContoller里調(diào)用GameController.Instance.Foo()執(zhí)行方法?;蛘咧苯訉nput寫成Listener的模式,讓GameController去監(jiān)聽。
- 其它的類似菜單控制器,聲音控制器,成就控制器,IAP虛擬道具控制器等等,也是采用類似的方法管理。
- 關于PlayerPref的操作,統(tǒng)一寫成靜態(tài)類的get/set模式,程序中哪里要用則直接讀寫。
- 如果你的項目里場景的數(shù)量少(<5),那么拖入場景的資源可以很隨意。如果場景數(shù)量很多(幾十個,有的解謎游戲每個關卡就是一個場景),那么拖入場景的prefab數(shù)量一定要少。
- 設計你的prefab資源里,你要想像當其他人拿到這些資源,是否直接拖入一個空場景里就能run,頂多再簡單設置幾下。如果你設計的資源不能做到這些,那么得好好重新想想。
更多精彩教程:http://windermere-rat-removal.com/resource/
- Tags:Unity教程
-
分享到:
相關文章
網(wǎng)友評論
全部評論:0條
推薦
熱門