Unity3D熱更新全書-指令碼(四) 用C#LightEvil搭建實際開發使用的指令碼框架

瘋光無線發表於2014-08-07

C#LightEvil之前提供了很多和Unity結合的例子,都是採用把指令碼檔案放置在StreamingAssets中的方法。

這樣可以利用Unity的特性,放在這個目錄中的CS檔案會被編譯器編譯,我們就利用C#編譯器來對我們的指令碼進行驗證。

同時StreamingAssets中的檔案又是直接隨專案釋出的,所以可以直接以檔案方式取出這些指令碼檔案編譯執行。

這是一個很巧妙的方式,但是用在實際專案中會有一些問題:

一、可能會讓程式設計師產生混淆,哪裡是指令碼,哪裡是程式,傻傻分不清楚

二、主程式裡會有一份用不到的程式碼

三、直接編譯指令碼檔案略慢,在手機上比較明顯,尤其指令碼檔案多的時候。

 

面對這三個問題,我們一次就可以全解決

我們的模式如下

1.首先建立一個獨立的C#專案,裡面只放指令碼程式碼。

2.然後當編譯這個專案的時候,會預編譯指令碼程式碼,並儲存成一個二進位制檔案。

3.然後在主程式裡直接載入這個二進位制檔案初始化指令碼,繼續後面的事情。

GitHub(https://github.com/lightszero/CSLightStudio)上新的例子CSLightStudio\unity\FrameworkMaster 就是這個框架

由於比較抽象,讓我們來介紹一下

imageBin目錄是生成的最後效果,image有兩個主程式,兩個指令碼二進位制檔案。

unity目錄裡面是主程式,兩個場景分別匯出了mode1 和 mode2

Mode1Script 和 Mode2Script是兩個指令碼檔案專案,他們是兩個ConsoleExe,從VS裡面編譯執行就會把自己專案裡的所有檔案作為C#Light編譯

image

image

並且輸出到../bin/也就bin下面的那個 .csledll.bytes 檔案

這樣就完成了指令碼檔案和Unity主專案的分開編譯,如果指令碼有錯誤,這個控制檯裡會給出資訊。

指令碼編譯:通過VS 建立指令碼專案並編譯驗證指令碼且生成二進位制檔案。

程式編譯:通過Unity編譯輸出。

這樣

1.指令碼和程式就完全隔離到了不同的專案裡,指令碼程式設計師寫指令碼,主程式的程式設計師寫主程式,各司其職。

2.另外指令碼程式也不會出現在主程式中

3.而且儲存的二進位制檔案是詞法處理後的結果,在手機上閃電載入。

 

也許聰明的你現在已經發現了一個問題,主程式裡面要對指令碼呼叫的型別進行註冊,還有很多是自己編寫的類,指令碼如果沒有這些資訊是沒法進行編譯驗證的。

對,這個就要利用Unity的另一個特性,Unity的專案程式碼用VS或者monodevelop編譯的話,會生成一個dll的,雖然unity不用他image

我們只要讓指令碼專案引用這個DLL,並用和主程式一樣的方式初始化指令碼引擎,就能得到和主程式一模一樣的指令碼編譯環境進行處理。

相關文章