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<LuaMax>("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
https://github.com/Tencent/xlua