網上有許多的LUA與Unity插件,如toLua,uLua, sLua, xLua。 uniLua因爲其複雜的集成使用過程,已經被主流所拋棄了。在對各個插件使用過以後,出此係列博客與你們分享一下心得。git
前面兩篇計劃說說toLua的那些事。github
toLua本身集成到項目裏,下載地址:https://github.com/topameng/toluajson
步驟以下:數組
- 1.複製assets目錄到項目裏
- 2.複製Unity5.x的Plugins到項目裏
集成後的結構是這樣的:函數
而後,開始Examples裏面內容的學習:性能
大概介紹一下各個實例,學習
- Helloworld,介紹了LuaState的生成,DoString以執行文件,Dispose來銷燬。注意銷燬前調用了CheckTop,用於檢測LUA棧中是否還有未執行的指令。
- ScriptsFromFile, 流程來講,首先生成一個虛擬機,再指定工做路徑後,讀取LUA文件內容來執行,使用DoFile和Require功能。
- CallLuaFunction,較xLua來講就提供了多種形式了。這裏簡單說明一下:
- 1.使用比較原始的方式,根據LUA的核心機制,使用pCALL指令將數據放LUA執行棧中,再從棧中取出。 luaFunc.Invoke就是對此的封裝
- 2.使用 luaFunc.ToDelegate 直接建立一個函數委託句柄。
- 3. 使用LUA虛擬機對象裏的Invoke來實現調用,實現機制基本與1同樣
- AccessingLuaVariables,這裏涉及LUA很實用的setmetatable函數,在腳本里首先生成了一個元表,再利用如下幾種形式測試:
- 1.使用LUASTATE虛擬機對象來直接取varTable中的內容。分別出了table數據和一個function數據並轉爲LuaFunction類型後直接能夠進行調用。
- 2.取成一個LuaTable對象以訪問其成員值,因爲定義了metatable,可使用其建立一個元表的實例來訪問,以能夠直接獲取metatable原型訪問數據。
- TestCoroutine,使用LUA的協程,使用於C#的協程相似,使用coroutine.start啓動一個函數,coroutine.stop來中止協程函數,其中使用的coroutine.wait,coroutine.step在lua官方文檔中能夠查閱。
- TestCoroutine2,橋接C#的協程,效率很低,不推薦。
- TestLuaThread, lua的coroutine映射到C#中tolua的封裝成luathread對象,resume來控制Lua中線程的運行。
- AccessingArray,傳遞一個數據給Lua,在Lua作遍歷讀取
- UseDictionary,字典的封裝,這裏須要將字典的類反射到Lua中。
- AccessingEnum,枚舉的使用,基於C#反射過去的類來操做。
- 11_Delegate,這裏實現將LUA中的普通函數轉化成C#中可用的Delegate,這樣能夠實現如C#中按鈕綁定某個LUA函數做爲事件。
- 12_GameObject,使用Unity內置相關的操做一個gameobject對象,這裏不一樣的插件性能有區分,具網上的一些大佬統計效率,toLua在此方面表現是最好的。
- 13_CustomLoader,自定義的一個LUA加載器,繼承LuaClient類後,能夠重寫StartMain函數,以實如今界面運行時就執行一段Lua腳本。注意,這裏使用的OnLoadFinished回調,所以會在awake和start前面,場景一加載進來就調用。
- 14_Out,就是個在LUA中簡單使用物理射線的例子。
- 15_ProtoBuffer,使用ProtoBuffer的傳輸協議來與作爲數據載體,此例中在LUA中也作實體進行解析處理。
- 16_Int64,LUA5.3的新特性,默認是double處理數據,使用Int64可處理78962871035984074- 9223372036854775807範圍的數據,此例使用lua的int64來處理。
- 17_Inherit,使用LUA的.Extend 的形式擴展LUA對象操做。
- 18_Bundle,使用WWW加載做爲Assetbundle的lua文件。
- 19_cjson,CJSON插件的使用。
- 20_utf8,UTF8編碼支持。
- 21_String,LUA橋接C#字符串的操做。固然這裏全用LUA本身的字符串也是能夠的。
- 22_Reflection,LUA中橋接C#的反射機制。
- 23_List,LUA橋接C#的數組容器。
- 24_Struct,關於C#中結構體如何橋接到LUA的示例。
- Performance,測試一些經常使用操做的消耗。
- TestErrorStack,TestOverload,操做棧測試