C#下Lua程式設計支援
xLua為Unity、 .Net、 Mono等C#環境增加Lua腳本程式設計的能力,借助xLua,這些Lua代碼可以友善的和C#互相調用。
xLua的突破
xLua在功能、性能、易用性都有不少突破,這幾方面分别最具代表性的是:
可以運作時把C#實作(方法,操作符,屬性,事件等等)替換成lua實作;
出色的GC優化,自定義struct,枚舉在Lua和C#間傳遞無C# gc alloc;
編輯器下無需生成代碼,開發更輕量;
更詳細的特性、平台支援介紹請看這裡。
安裝
打開zip包,你會看到一個Assets目錄,這目錄就對應Unity工程的Assets目錄,保持這目錄結構放到你的Unity工程。
如果希望安裝到其它目錄,請看FAQ相關介紹。
lua5.3 vs luajit
xLua有兩個版本,分别內建了lua5.3和luajit,一個項目隻能選擇其一。這兩個版本C#代碼是一樣的,不同的是Plugins部分。
lua5.3的特性更豐富些,比如支援原生64位整數,支援蘋果bitcode,支援utf8等。出現問題因為是純c代碼,也好定位。比起luajit,lua對安裝包的影響也更小。
而luajit勝在性能,如果其jit不出問題的話,可以比lua高一個數量級。目前luajit作者不打算維護luajit,在找人接替其維護,後續發展不太明朗。
項目可以根據自己情況判斷哪個更适合。因為目前lua53版本使用較多,是以xLua工程Plugins目錄下預設配套是lua53版本。
快速入門
一個完整的例子僅需3行代碼:
安裝好xLua,建一個MonoBehaviour拖到場景,在Start加入如下代碼:
XLua.LuaEnv luaenv = new XLua.LuaEnv();
luaenv.DoString("CS.UnityEngine.Debug.Log('hello world')");
luaenv.Dispose();
1、DoString參數為string,可輸入任意合法的Lua代碼,本示例在lua裡調用C#的UnityEngine.Debug.Log列印了個日志。
2、一個LuaEnv執行個體對應Lua虛拟機,出于開銷的考慮,建議全局唯一。
C#主動調用lua也很簡單,比如要調用lua的系統函數,推薦方式是:
聲明
[XLua.CSharpCallLua]
public delegate double LuaMax(double a, double b);
綁定
var max = luaenv.Global.GetInPath("math.max");
調用
Debug.Log("max:" + max(32, 12));
建議綁定一次,重複使用。生成了代碼的話,調用max是不産生gc alloc的。
熱更新檔
侵入性小,老項目原有代碼不做任何調整就可使用。
運作時影響小,不打更新檔基本和原有程式一樣。
出問題了可以用Lua來打更新檔,這時才會走到lua代碼邏輯;
這裡是使用指南。
更多示例
01_Helloworld: 快速入門的例子。
02_U3DScripting: 展示怎麼用lua來寫MonoBehaviour。
03_UIEvent: 展示怎麼用lua來寫UI邏輯。
04_LuaObjectOrented: 展示lua面向對象和C#的配合。
05_NoGc: 展示怎麼去避免值類型的GC。
06_Coroutine: 展示lua協程怎麼和Unity協程相配合。
07_AsyncTest: 展示怎麼用lua協程來把異步邏輯同步化。
08_Hotfix: 熱更新檔的示例(需要開啟熱更新檔特性,如何開啟請看指南)。
09_GenericMethod: 泛化函數支援的示範。
10_SignatureLoader: 展示如何讀取經數字簽名的lua腳本,參見數字簽名的文檔介紹。
文檔
XLua教程.doc:教程,其配套代碼這裡。
XLua的配置.doc:介紹如何配置xLua。
XLua增加删除第三方lua庫.doc:如何增删第三方lua擴充庫。
XLua API.doc:API文檔。
生成引擎二次開發指南:介紹如何做生成引擎的二次開發。
熱更新檔操作指南:介紹如何使用熱更新檔特性。
技術支援
QQ群:612705778 驗證答案:有問題先找FAQ
<a href="https://github.com/Tencent/xlua">https://github.com/Tencent/xlua</a>
jiahuafu