如何通过服务器发送函数信息给客户端
如何通过服务器发送函数信息给客户端
- 此方法适用于主要逻辑运行于服务器,客户端逻辑较简易的情况。
- 对于更熟悉元梦扣叮的创作者,此方法也可以作为过渡。
- 在客户端-服务器通信中传递的消息,无法传递函数,因此需要定义表来完成中转。
首先,定义关联客户端函数的表
--示例中的脚本,写在名为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(NetMsg.S2C_SendFunctions, self.S2C_SendFunctions, self)end3.制作客户端接收消息后的函数
--可以参考下面的例子function Test:S2C_SendFunctions(msgId, msg) --示例中直接取消息的第一个元素 local temp_table=msg[1] -- 从FuncMap表中获取函数 local func = FuncMap[temp_table.funcName] if func then -- 调用函数,传入参数(用 unpack 解包参数列表) func(table.unpack(temp_table.args)) else print("未知函数:", temp_table.funcName) 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(NetMsg.S2C_SendFunctions,{msg_table}) end)end