这篇来讲说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。