更高效地使用数据存储

Use datastore more efficiently

我正在用 lua 在 Roblox Stuido ide 上编写我的拳头游戏。游戏运行——有点——,虽然我知道代码不是很好。这是一款小 children 游戏,其中一个数字显示在标志上,玩家必须前往与该数字匹配的平台。我遇到的问题之一是我希望有一个 GUI 可以显示大量的点数,因为在顶角的领导者统计数据不容易看到。我想要的不仅仅是让玩家看到他们自己的点数这会更容易一些,只需使用如下脚本在入门玩家 gui 上添加一个 textLabel:

while true do 
    wait(.1)
    script.Parent.Text = game.Players.LocalPlayer.leaderstats.Platforms.Value
end

也使用以下代码:

game.Players.PlayerAdded:connect(function(player)
    local playerKey = "Player_" .. player.UserId
    local leaderstats = Instance.new("Folder",player)
    leaderstats.Name = "leaderstats"
    local Platforms = Instance.new("IntValue", leaderstats) 
    Platforms.Name = "Platforms"
    Platforms.Value = 0
    platformCount:SetAsync(player.UserId, 0)
    StartGui:FireAllClients(player)

end)

请注意该块的最后几行,这是我想出的。我不确定如何做得更好,但我觉得他们是个拙劣的人。

我的objective是每个玩家不仅可以看到实时更新的分数,还可以看到其他玩家的分数。这是没有完全发挥作用的地方。我的方法如下。当玩家踏上所需的平台时,我在本地脚本上有这段代码

                allPlats[k].Eliminated = true
                player:WaitForChild("leaderstats"):FindFirstChild("Platforms").Value = player:WaitForChild("leaderstats"):FindFirstChild("Platforms").Value + 1 --increase leaderstats
                points = points + 1
                numIfScored:InvokeServer(column, row, teamColorReady, points, team)
                PlatformDeleted.OnClientEvent:Connect(platformTransparency)

忽略不适用于问题的行。这个问题的重要部分是我访问在 leaderstats 中创建的 intValue 并将其值增加 1。我还通过远程功能向服务器发送调用,该功能传递平台所在的位置、团队的颜色等...

服务器ide脚本然后使用这些值来执行一些与设置下一个目标和更新平台外观相关的任务,最重要的是,将数据发送到数据存储:

函数numIfScored.OnServerInvoke(plr, col, row, orignalTeamColor, points, team)

game.Workspace.TargetNumber.Value = getAnddisplayTarget(col, row)

PlatformDeleted:FireAllClients(col, row)

for k, v in pairs(allPlats) do 
    if v.Column == col and v.Row == row then
        v.Part.Transparency = 0
        v.Part.Material = "Neon"
        v.Part.BrickColor = BrickColor.new(orignalTeamColor)
    end
end
platformCount:SetAsync(plr.UserId, points)

结束

然后我 运行 同一个脚本中的一个单独的代码块,它通过从数据存储中获取点来不断更新 gui:

while wait(.1) do   
    for _, player in pairs(Players:GetPlayers()) do

        local points = platformCount:GetAsync(player.UserId)
        UpdateGUI:FireAllClients(player.UserId,points, player.Team)
    end
end

我有一个本地脚本,它是显示分数的文本标签的 child,代码如下:

local function UpdateLabel(plrId, points, team)

    if team.Name == "Really red Team" then
    game.Players.LocalPlayer.PlayerGui.ScreenGui.RedTeam.Text = points
    elseif team.Name == "Really blue Team" then
    game.Players.LocalPlayer.PlayerGui.ScreenGui.BlueTeam.Text = points
    end
end
StartGui.OnClientEvent:Connect(StartLabel)

这有效但有问题。我在家里和我儿子一起玩,它有点工作,有点滞后,但当我尝试和其他玩家一起玩时,比如我的朋友和他的儿子,系统就停止工作了。我知道的一件事是不好的,如果你在另一个玩家加入之前就开始玩,那么那个玩家在他们进来之前就看不到你的进度。另一个问题是第一个加入的玩家会被后来加入的玩家看到, 但随着玩家加入,无法看到之前加入玩家的标签。

有没有更简单的方法来创建一个 gui 来更新所有玩家 gui 中的所有玩家分数?谢谢。

如果需要,我可以 post 完整代码。

无需完整代码。我只需要 "It's in a LocalScript" 这句话。即使您在服务器脚本中更改标签文本,您也是在本地脚本中添加点数,这意味着它只会为您更改点数,而不会为任何其他玩家更改点数。相反,如果您使用 RemoteFunction 并调用服务器来更改点,我非常确定它应该可以工作。