更有效地使用数据存储

Posted

技术标签:

【中文标题】更有效地使用数据存储【英文标题】:Use datastore more efficiently 【发布时间】:2020-04-29 17:36:47 【问题描述】:

我正在 Roblox Stuido ide 上用 lua 编写我的拳头游戏。游戏工作——有点——,虽然我知道代码不是很好。这是一个小孩子的游戏,其中一个数字显示在一个标志上,玩家必须去与数字匹配的平台。我遇到的一个问题是,我希望有一个 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)

请注意该块的最后几行,这是我想出的。我不确定如何做得更好,但我觉得它们很糟糕。

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

                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 并将其值增加一。我还使用远程函数向服务器发送调用,该函数传递平台所在的位置、团队的颜色等......

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

function 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

我有一个本地脚本,它是使用以下代码显示分数的文本标签的子项:

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?谢谢。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于更有效地使用数据存储的主要内容,如果未能解决你的问题,请参考以下文章

如何更有效地将词汇存储在数组中?

使用 python 和 sqlite 进行网页抓取。如何有效存储抓取的数据?

如何更有效地存储距离矩阵?

如何以索引方式有效地存储所有 OpenStreetMap 数据?

CSV到列,与基于行的数据连接,分析和输出 - 是否可以有效地完成?

如何在Python中更有效地审计GCP存储桶中的数千个对象