接收前端消息
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-04-14 16:47:26 |
👁️ 阅读: 12
在996引擎中,接收前端消息主要通过注册事件监听器来实现。根据浮生梦老师前端课程内容,主要有以下几种方式:
## 1. 接收网络消息(服务端发往前端)
使用 `SL:RegisterLuaNetMsg()` 函数监听服务端发送的网络消息:
```lua
-- 注册网络消息监听
-- msgID: 消息ID(需要转换为数字)
-- callback: 回调函数,参数为 (msgID, p1, p2, p3, msgData)
-- self._parent: 父节点(可选,用于管理生命周期)
SL:RegisterLuaNetMsg(tonumber(msgID), function (_msgID, p1, p2, p3, msgData)
SL:Print("接收到网络消息", _msgID, p1, p2, p3, msgData)
-- 在这里处理消息逻辑
end, self._parent)
```
## 2. 接收引擎事件消息
使用 `SL:RegisterLUAEvent()` 函数监听引擎事件:
```lua
-- 注册LUA事件监听
-- eventName: 事件名称常量
-- moduleName: 模块名称(字符串)
-- callback: 回调函数
-- 示例1:点击NPC打开界面
SL:RegisterLUAEvent(LUA_EVENT_TALKTONPC, "GUIUtil", function (...)
SL:Print("点击NPC事件触发", ...)
-- 打开界面逻辑
end)
-- 示例2:地图信息变化
SL:RegisterLUAEvent(LUA_EVENT_MAPINFOCHANGE, "GUIUtil", function ()
SL:Print("地图信息发生变化")
-- 刷新地图相关数据
end)
-- 示例3:怪物死亡事件
SL:RegisterLUAEvent(LUA_EVENT_MONSTER_DIE, "GUIUtil", function (data)
if not data or not data.id then return end
SL:Print("怪物死亡", data.id)
-- 处理怪物死亡逻辑
end)
-- 示例4:富文本超链接点击事件
SL:RegisterLUAEvent(LUA_EVENT_RICHTEXT_OPEN_URL, "GUIUtil", function (...)
SL:Print("超链点击触发", ...)
-- 处理超链接点击逻辑
end)
```
## 3. 实际应用案例
### 案例1:转盘抽奖动画
```lua
-- 收到服务端消息,播放抽奖动画
SL:RegisterLuaNetMsg(101, function (msgID, p1, p2, p3, msgData)
zhuanpanOBJ:lotteryAnim(msgID)
end)
```
### 案例2:BOSS死亡刷新
```lua
-- 监听到后端的网络消息,重新更新地图内的boss墓碑
SL:RegisterLuaNetMsg(999, function (msgID, p1, p2, p3, msgData)
SL:RequestMiniMapMonsters()
end)
```
## 4. 消息处理注意事项
1. **消息ID处理**:网络消息ID需要使用 `tonumber()` 转换
2. **参数说明**:
- `_msgID`: 消息ID
- `p1, p2, p3`: 消息参数(根据服务端定义)
- `msgData`: 消息数据(通常是table)
3. **生命周期管理**:通过传入 `self._parent` 参数,当父节点销毁时会自动清理消息监听
4. **调试打印**:使用 `SL:Print()` 输出调试信息
## 5. 完整示例代码
```lua
local MyModule = {}
function MyModule:init()
-- 创建父节点
self._parent = GUI:Win_Create("MyModule", 0, 0, 0, 0, false, false, true, false, false, false, 1)
-- 注册网络消息
SL:RegisterLuaNetMsg(1001, function(msgID, p1, p2, p3, data)
SL:Print("收到网络消息1001", data)
self:handleNetMessage(data)
end, self._parent)
-- 注册引擎事件
SL:RegisterLUAEvent(LUA_EVENT_MAPINFOCHANGE, "MyModule", function()
SL:Print("地图变化事件")
self:refreshMapData()
end)
end
function MyModule:handleNetMessage(data)
-- 处理网络消息逻辑
SL:Print("处理消息数据:", data)
end
function MyModule:refreshMapData()
-- 刷新地图数据逻辑
SL:Print("刷新地图数据")
end
return MyModule
```
这样你就可以在前端接收和处理各种消息了。记得在不需要时及时清理消息监听,避免内存泄漏。
← 返回问答库