本帖最后由 tibaiwan1888 于 2026-6-4 23:56 编辑
-- EventBus.lua
-- 用于解耦各模块间的通信,避免脚本互相直接调用造成依赖混乱
local EventBus = {}
local _listeners = {}
-- 订阅事件
function EventBus.on(event, callback)
if not _listeners[event] then
_listeners[event] = {}
end
table.insert(_listeners[event], callback)
end
-- 取消订阅
function EventBus.off(event, callback)
local list = _listeners[event]
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[event]
if not list then return end
for _, cb in ipairs(list) do
local ok, err = pcall(cb, ...)
if not ok then
print("[EventBus] 事件处理异常 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
|