跳转到内容

如何通过服务器发送函数信息给客户端

如何通过服务器发送函数信息给客户端

  • 此方法适用于主要逻辑运行于服务器,客户端逻辑较简易的情况。
  • 对于更熟悉元梦扣叮的创作者,此方法也可以作为过渡。
  • 在客户端-服务器通信中传递的消息,无法传递函数,因此需要定义表来完成中转。

首先,定义关联客户端函数的表

--示例中的脚本,写在名为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)
end

3.制作客户端接收消息后的函数

--可以参考下面的例子
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)
end
end

4.需要使用时,按照下面的思路,服务器发送消息到客户端,传入定义表中的函数名与所需参数即可;根据需要,可以发往单独的客户端或全部客户端。

完成后,试玩就可以查看效果了。

--举例,在服务器开始函数中添加
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