這篇來講說github上的的toLua框架 LuaFramework。兩個版本分別對應UGUI和NGUI。這個框架是基於新一代toLua#的,toLua#的性能是強過uLua和早期的toLua,且自帶assetbundle機制,方便用戶開發。git
框架地址: https://github.com/jarjin/LuaFramework_UGUIgithub
在使用過程當中仍是得多看看官方給的文檔: http://doc.ulua.org/default.asp框架
整體來講有點繞,剛使用時因爲結構不清楚容易迷失。不過設計思想仍是很好的。在框架使用上,Main.lua作爲對於一個全局入口,而非單個遊戲的入口,個人作法的是將Controller,View寫好後,具有原生回調的Model層須要在C#實現而後直接進行橋接,固然這樣作的Model是沒法進行擴展的! 因此能夠採用將C#的各實體帶MonoBehavior的類以「固定形式」橋接到LUA中實現。函數
好比以下一種狀況,你們有什麼好辦法呢?性能
1.LUA實例兩個帶剛體帶碰撞的Cube測試
2.C#層實現一個碰撞檢測,得到回調OnCollisionEnter,將碰撞的對象(GameObject)傳給LUA。lua
3.在LUA中拿到此GameObject後,如何斷定是碰了1中的哪一個Cube呢?spa
個人方法:設計
1. 比較的謹慎的辦法, 爲Cube建立惟一的名字,取出來後經過名字斷定orm
2. 最直接的方法!! 直接比較GameObject,經不斷測試,徹底能夠。
方法2爲何可行,我以爲這是由於GameObject實際地址仍然是在C#,所以經過LUA的==(比較對象地址和值) 所得結果仍是咱們想要的。
另外,框架爲咱們提供了Event機制,這個機制是個廣播機制,全局全部AddEventListener此事件的回調函數都會被調用。 那麼若是隻想監聽某個lua類呢?能夠嘗試將某個元表實例出來的對象添加以下代碼:
function object:addEventListener(eventName, listener, target) print(eventName) eventName = string.upper(eventName) if object.listeners_[eventName] == nil then object.listeners_[eventName] = {} end local ttarget = type(target) if ttarget == "table" or ttarget == "userdata" then listener = handler(target, listener) -- tag = "" end object.listenerHandleIndex_ = object.listenerHandleIndex_ + 1 local handle = string.format("HANDLE_%d", object.listenerHandleIndex_) object.listeners_[eventName][handle] = listener return handle end function object:dispatchEvent(event) event.name = string.upper(event.name) local eventName = event.name if object.listeners_[eventName] == nil then return end event.target = object for handle, listener in pairs(object.listeners_[eventName]) do local ret = listener(event, a) if ret == false then break elseif ret == "__REMOVE__" then object.listeners_[eventName][handle] = nil end end end
這樣咱們就能夠指定一個調用者對象來監聽一個事件,算是對特殊需求的使用。
最後,結合總體來講toLua及Lua Framework框架,是目前快速開發以LUA爲主體語言的U3D項目的最佳選擇! 後續來聊聊XLUA。