关于LUA+Unity开发_toLua篇【二】

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

猜你喜欢

转载自my.oschina.net/u/138823/blog/1612750