unity和xlua 第三步如何在lua里面实现监听事件

1

--EventManager.lua   位于Assets/GameRes/Lua/
local EventManager = {}

local listenerTable = { }

--添加监听  是不是重复监听
EventManager.AddListener = function(eventType, listener,target)
    --如果其参数 v 的值为假(nil 或 false), 它就调用 error; 否则,返回所有的参数。
    --assert (v [, message])
    assert(eventType,'eventType is nil!')
    local t = listenerTable[eventType]
    if not t then
        t = {}
        listenerTable[eventType] = t
    end
    --遇到一样的监听会增加表里面一个数据
    t[#t + 1] = {listener = listener , target = target}   
end

--触发监听
EventManager.TriggerListener = function(eventType,arg)
    --pcall以保护模式调用函数f。  第一个返回值是状态码,当没有错误时,其为真,第二个状态
    --码为返回的错误
    local ok,errors= pcall(function()
        
        assert(eventType,'eventType is nil!')
        local t = listenerTable[eventType]
        if t then
            for i = #t,1,-1 do  --遍历所有同样事件类型
                if t[i] then
                    if t[i].target == nil then
                        t[i].listener(arg)
                    else
                        t[i].listener(t[i].target,arg)  --有的需要传递方法自身
                    end
                end
            end
        end
    
    end)

    if not ok then 
        local errorMessage = "error on troggerListener , type is "..eventType.."\n"..errors
        CS.UnityEngine.Debug.LogError(errorMessage)
    end
end

EventManager.RemoveListener = function (eventType,listener,target)
    assert(eventType,"eventType is nil!")
    local t = listenerTable[eventType]
    if t then
        if target then
            for i = 1,#t do
                if t[i].target == target and t[i].listener == listener then
                    table.remove(t,i)
                    break
                end
            end
            return
        end
        for i = 1,#t do
            if  t[i].listener == listener then
                table.remove(t,i)
                break
            end
        end

    end

end

return EventManager

 

 

2

--EventType.lua  位于位于Assets/GameRes/Lua/
local EventType = {}

EventType.Test = 1
EventType.CreateUI = 2

return EventType

 

 

3.如何在main.lua调用

--main.lua
local EventManager = require "EventManager"
local EventType = require "EventType"

function Awake()
    print("Lua Awake")
    EventManager.AddListener(EventType.Test,function(arg) print("Test"..tostring(arg))  end)
end

function Start()
    print("Lua Start")
    EventManager.TriggerListener(EventType.Test,"6666")
end


--长时间函数
function Update()
    --print("Lua Update")
end

function OnDestroy()
    print("Lua OnDestory")
end

function SceneLoaded(name)
    print("Lua SceneLoaded "..name)
    
end

function SceneUnloaded(name)
    print("Lua SceneUnloaded  "..name)
end

function OnApplicationFocus(focus)
    print("Lua OnApplicationFocus "..tostring(focus))
end

function OnApplicationPause(pause)
    print("Lua OnApplicationPause "..tostring(pause))
end

function OnApplicationQuit()
    print("Lua OnApplicationQuit ")
end

 

你可能感兴趣的:(总栏目)