天天看點

手遊熱更新方案xLua開源:Unity3D下Lua程式設計解決方案

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