如何通过服务器发送函数信息给客户端
如何通过服务器发送函数信息给客户端
- 此方法适用于主要逻辑运行于服务器,客户端逻辑较简易的情况。
- 对于更熟悉元梦扣叮的创作者,此方法也可以作为过渡。
- 在客户端-服务器通信中传递的消息,无法传递函数,因此需要定义表来完成中转。
首先,定义关联客户端函数的表
--示例中的脚本,写在名为Test的脚本中,创作者可根据实际情况调整,下略。FuncMap = { --例如,函数名为SetText,需要参数widget和text(也就是对应函数UI:SetText所需参数) SetText = function (widget,text) UI:SetText({widget},text) end, --角色跳跃的例子,这里不需要参数 Jump = function () Character:Jump() end -- 其他需要传递的函数...}然后,完成下列操作
1.注册一个消息,用于接收服务器下发函数
-- 网络协议NetMsg = { --在模板原有消息下方加入下面的消息 S2C_SendFunctions = 1006,}2.在客户端初始化中,注册消息
--参考下面的写法function Test:OnClientInit() System:BindNotify(_GAME.NetMsg.S2C_SendFunctions, self.S2C_SendFunctions, self)end3.制作客户端接收消息后的函数
--可以参考下面的例子function Test:S2C_SendFunctions(msgId, msg) if msg then -- 从FuncMap表中获取函数 local func = _GAME.FuncMap[msg.funcName] if func then -- 调用函数,传入参数(用 unpack 解包参数列表) func(table.unpack(msg.args))
else print("未知函数:", msg.funcName) end endend4.需要使用时,按照下面的思路,服务器发送消息到客户端,传入定义表中的函数名与所需参数即可;根据需要,可以发往单独的客户端或全部客户端。
完成后,试玩就可以查看效果了。
--举例,在服务器开始函数中添加function Test:OnServerStart()
local server_number = 1 TimerManager:AddLoopTimer(1,function () --每秒数字加1 server_number = server_number+1 --传递消息的表 local msg_table={ funcName = "SetText", -- 函数名(字符串) args = {100046,tostring(server_number)} -- 参数列表,这里包含控件id(示例中为100046)与要显示的文本字符串(示例中为server_number) } --举例,向全部客户端发送这个消息 System:SendToAllClients(_GAME.NetMsg.S2C_SendFunctions,msg_table)
end)end