2019独角兽企业重金招聘Python工程师标准>>>
这篇来说说github上的的toLua框架 LuaFramework。两个版本分别对应UGUI和NGUI。这个框架是基于新一代toLua#的,toLua#的性能是强过uLua和早期的toLua,且自带assetbundle机制,方便用户开发。
框架地址: https://github.com/jarjin/LuaFramework_UGUI
在使用过程中还是得多看看官方给的文档: http://doc.ulua.org/default.asp
总体来说有点绕,刚使用时由于结构不清楚容易迷失。不过设计思想还是很好的。在框架使用上,Main.lua做为对于一个全局入口,而非单个游戏的入口,我的做法的是将Controller,View写好后,具备原生回调的Model层需要在C#实现然后直接进行桥接,当然这样做的Model是无法进行扩展的! 所以可以采用将C#的各实体带MonoBehavior的类以“固定形式”桥接到LUA中实现。
比如如下一种情况,大家有什么好办法呢?
1.LUA实例两个带刚体带碰撞的Cube
2.C#层实现一个碰撞检测,获得回调OnCollisionEnter,将碰撞的对象(GameObject)传给LUA。
3.在LUA中拿到此GameObject后,如何判定是碰了1中的哪个Cube呢?
我的方法:
1. 比较的谨慎的办法, 为Cube创建唯一的名字,取出来后通过名字判定
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。