背景
我們知道Unity3d是通過C#腳本語言的形式來實(shí)現(xiàn)游戲的邏輯代碼編寫,同樣SCOTT服務(wù)器也設(shè)置了通過C#腳本來實(shí)現(xiàn)游戲邏輯,但是本文并不是想真正分析解密他們的運(yùn)行機(jī)制,只是想通過自己的一個(gè)需求,來探討總結(jié)下其中的原理。
下面來說下我自己的需求,比較簡(jiǎn)單,由于經(jīng)常在非開發(fā)環(huán)境部署一些小工具,做系統(tǒng)維護(hù),但每次又懶得帶筆記本和編譯環(huán)境到現(xiàn)場(chǎng),但系統(tǒng)數(shù)據(jù)又總是那么奇葩,時(shí)常有bug出現(xiàn),突發(fā)奇想是否是能把工具做成腳本,這樣現(xiàn)場(chǎng)就很容易進(jìn)行調(diào)整(簡(jiǎn)單修改腳本),現(xiàn)場(chǎng)搞定不用來回折騰,豈不是很Happy。
聲明:本文首發(fā)于蠻牛,次發(fā)博客園,本人原創(chuàng)。
http://www.manew.com/thread-96136-1-1.html
原理
Unity3d使用的Mono這個(gè)地球人知道,Scott呢?我以前分析過其源碼,大概知道它需要兼容IconPyhton和C#兩種腳本,所以它做了一層封裝,但是看它引用的DLL lib有Mono的影子,所以估計(jì)也是Mono(不對(duì)請(qǐng)拍磚,其實(shí)它用什么無所謂了)。實(shí)際原理很簡(jiǎn)單了,也就是腳本動(dòng)態(tài)編譯(有點(diǎn)像解釋執(zhí)行,嚴(yán)格上應(yīng)該不是,我覺得李總的熱更新的腳本應(yīng)該不是動(dòng)態(tài)編譯的因?yàn)楹芏嗥脚_(tái)根本不支持比如IOS),查了下資料目前c#動(dòng)態(tài)編譯的一共三種方式CodeDom,Mono,Roslyn,這三種教程應(yīng)該是一堆一堆的,但是Mono和Roslyn的都不是很多,畢竟這個(gè)需求比較小眾,而且Roslyn是最新出來的,例子都是“Hello world”級(jí)別的讓人很不爽,最后發(fā)現(xiàn)一個(gè)庫CS-Script,網(wǎng)址是https://csscriptsource.codeplex.com/,看了下文檔,瞟一眼代碼:
CSScript.EvaluatorConfig.Engine = EvaluatorEngine.Roslyn; //EvaluatorEngine.Mono; //EvaluatorEngine.CodeDom; var sqr = CSScript.Evaluator .CreateDelegate(@"int Sqr(int a) { return a * a; }"); var r = sqr(3);
看到1,2,3行代碼的時(shí)候,我會(huì)心的笑了,實(shí)際上CS-Script是對(duì)于三種方式的上層封裝,可以自定義選擇用那一種,這個(gè)方案對(duì)于我的已經(jīng)夠用了。下面就是做個(gè)試驗(yàn),然后實(shí)施即可。