首页 > 解决方案 > 传入字符串后尝试将实例与字符串连接时出错

问题描述

因此,我正在尝试StarterCharacterScripts在本地脚本中制作一个游戏,在触摸一个部分时调用WinPad它以触发一个事件,该事件在聊天中发送一条消息,并将一个发送PostAsync()到 Discord webhook。但是,在触发事件时,attempt to concatenate Instance with string即使所有传入的参数都是字符串,它也会给出错误。这是 LocalScript 中的事件触发程序:

        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是被触摸的部分LocalPlayer.Character.Humanoid

标签: luawebhooksrobloxhttpservice

解决方案


当您使用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, towername, towerdiff, towerdiffid, color)
    -- format some messages
    local message = "%s has beaten %s."
    local hookMessage = string.format(message,
        "**" .. player.Name .. "**",
        string.format("**%s [<:%s:%s>]**", towername, towerdiff, 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)

推荐阅读