C#LightEvil之前提供了很多和Unity結合的例子,都是採用把指令碼檔案放置在StreamingAssets中的方法。
這樣可以利用Unity的特性,放在這個目錄中的CS檔案會被編譯器編譯,我們就利用C#編譯器來對我們的指令碼進行驗證。
同時StreamingAssets中的檔案又是直接隨專案釋出的,所以可以直接以檔案方式取出這些指令碼檔案編譯執行。
這是一個很巧妙的方式,但是用在實際專案中會有一些問題:
一、可能會讓程式設計師產生混淆,哪裡是指令碼,哪裡是程式,傻傻分不清楚
二、主程式裡會有一份用不到的程式碼
三、直接編譯指令碼檔案略慢,在手機上比較明顯,尤其指令碼檔案多的時候。
面對這三個問題,我們一次就可以全解決
我們的模式如下
1.首先建立一個獨立的C#專案,裡面只放指令碼程式碼。
2.然後當編譯這個專案的時候,會預編譯指令碼程式碼,並儲存成一個二進位制檔案。
3.然後在主程式裡直接載入這個二進位制檔案初始化指令碼,繼續後面的事情。
GitHub(https://github.com/lightszero/CSLightStudio)上新的例子CSLightStudio\unity\FrameworkMaster 就是這個框架
由於比較抽象,讓我們來介紹一下
Bin目錄是生成的最後效果,有兩個主程式,兩個指令碼二進位制檔案。
unity目錄裡面是主程式,兩個場景分別匯出了mode1 和 mode2
Mode1Script 和 Mode2Script是兩個指令碼檔案專案,他們是兩個ConsoleExe,從VS裡面編譯執行就會把自己專案裡的所有檔案作為C#Light編譯
並且輸出到../bin/也就bin下面的那個 .csledll.bytes 檔案
這樣就完成了指令碼檔案和Unity主專案的分開編譯,如果指令碼有錯誤,這個控制檯裡會給出資訊。
指令碼編譯:通過VS 建立指令碼專案並編譯驗證指令碼且生成二進位制檔案。
程式編譯:通過Unity編譯輸出。
這樣
1.指令碼和程式就完全隔離到了不同的專案裡,指令碼程式設計師寫指令碼,主程式的程式設計師寫主程式,各司其職。
2.另外指令碼程式也不會出現在主程式中
3.而且儲存的二進位制檔案是詞法處理後的結果,在手機上閃電載入。
也許聰明的你現在已經發現了一個問題,主程式裡面要對指令碼呼叫的型別進行註冊,還有很多是自己編寫的類,指令碼如果沒有這些資訊是沒法進行編譯驗證的。
對,這個就要利用Unity的另一個特性,Unity的專案程式碼用VS或者monodevelop編譯的話,會生成一個dll的,雖然unity不用他
我們只要讓指令碼專案引用這個DLL,並用和主程式一樣的方式初始化指令碼引擎,就能得到和主程式一模一樣的指令碼編譯環境進行處理。