tibaiwan1888 发表于 2026-6-4 23:54:49

[Lua] 事件总线(EventBus)设计模式在VVM2中的实践

本帖最后由 tibaiwan1888 于 2026-6-4 23:56 编辑

-- EventBus.lua
-- 用于解耦各模块间的通信,避免脚本互相直接调用造成依赖混乱

local EventBus = {}
local _listeners = {}

-- 订阅事件
function EventBus.on(event, callback)
    if not _listeners then
      _listeners = {}
    end
    table.insert(_listeners, callback)
end

-- 取消订阅
function EventBus.off(event, callback)
    local list = _listeners
    if not list then return end
    for i = #list, 1, -1 do
      if list == callback then
            table.remove(list, i)
      end
    end
end

-- 触发事件
function EventBus.emit(event, ...)
    local list = _listeners
    if not list then return end
    for _, cb in ipairs(list) do
      local ok, err = pcall(cb, ...)
      if not ok then
            print(" 事件处理异常 event=" .. event .. " err=" .. tostring(err))
      end
    end
end


local EventBus = require("EventBus")-- 玩家死亡时触发掉落计算、公告、日志三个独立模块-- 三者互不依赖,各自订阅事件即可EventBus.on("player_die", function(playerName, killer)    -- 模块A:掉落处理    DropManager.onPlayerDie(playerName)end)EventBus.on("player_die", function(playerName, killer)    -- 模块B:公告    SendNotice(killer .. " 击杀了 " .. playerName)end)EventBus.on("player_die", function(playerName, killer)    -- 模块C:日志    LogManager.write("PVP", playerName .. " died by " .. killer)end)-- 任意地方触发EventBus.emit("player_die", "张三", "李四")
为什么要这样做?直接在死亡回调里堆逻辑,改一处容易牵连全局。EventBus 让每个功能模块独立订阅、独立维护,新增功能只需 on,删除功能只需 off,零侵入。
return EventBus





页: [1]
查看完整版本: [Lua] 事件总线(EventBus)设计模式在VVM2中的实践