传入字符串后尝试将 Instance 与字符串连接时出错

问题描述

所以我试图制作一个游戏,在本地脚本中的 StarterCharacterScripts 中,在触摸一个名为 WinPad 的部分时,它会触发一个事件,在聊天中发送一条消息,并发送一个 { {1}} 到 discord 网络钩子。但是,在触发事件时,即使所有传入的参数都是字符串,它也会给出错误 PostAsync()。这是 LocalScript 中的事件触发:

attempt to concatenate Instance with string

这是 local name = tP:FindFirstChild("TowerName") local diff = tP:FindFirstChild("Difficulty") local diffid = tP:FindFirstChild("DifficultyId") local diffcolor = tP:FindFirstChild("DiffColor3") game.ReplicatedStorage.WinEvent:FireServer(game.Players.LocalPlayer.Name,name.Value,diff.Value,diffid.Value,diffcolor.Value) 脚本:

OnServerEvent:Connect()

另外,game.ReplicatedStorage.WinEvent.OnServerEvent:Connect(function(plr,towername,towerdiff,towerdiffid,color) local HookData = { ['content'] = "**"..plr.."** has beaten **"..tostring(towername).." [<:"..tostring(towerdiff)..":"..tostring(towerdiffid)..">]**." } HookData = http:JSONEncode(HookData) http:PostAsync(url,HookData) plr.Parent:Moveto(Vector3.new(-764,12.5,-54.5)) createSystemMessage:FireAllClients((plr.." has beaten "..towername.."."),color,Enum.Font.sourceSansBold,Enum.FontSize.Size14) end) tP接触的部分

解决方法

当您使用 RemoteEvents' OnServerEvent 信号时,第一个参数始终是使用 FireServer 函数的 Player,并且由引擎自动提供。您的函数签名应如下所示:

function(player,plrname,towername,towerdiff,towerdiffid,color)

但是,不需要提供玩家名称,因为您可以从 player.Name 获取。因此,为了解决您的问题并清理您的代码,我会在您的 LocalScript 中推荐这个:

local winevent = game.ReplicatedStorage.WinEvent

local name = tP.TowerName.Value
local diff = tP.Difficulty.Value
local diffid = tP.DifficultyId.Value
local diffcolor = tP.DiffColor3.Value

winevent:FireServer(name,diff,diffid,diffcolor)

这在您的服务器脚本中:

local winEvent = game.ReplicatedStorage.WinEvent
winEvent.OnServerEvent:Connect(function(player,color)
    -- format some messages
    local message = "%s has beaten %s."
    local hookMessage = string.format(message,"**" .. player.Name .. "**",string.format("**%s [<:%s:%s>]**",towerdiffid))
    local playerMessage = string.format(message,player.Name,towername)

    -- fire some data to some server
    local HookData = {
            ['content'] = hookMessage,}
    HookData = http:JSONEncode(HookData)
    http:PostAsync(url,HookData)

    -- move the player's character somewhere
    player.Character:MoveTo(Vector3.new(-764,12.5,-54.5))

    -- alert everyone that stuff has happened
    createSystemMessage:FireAllClients(playerMessage,color,Enum.Font.SourceSansBold,Enum.FontSize.Size14)
end)