通过数据存储保存零件位置

问题描述 投票:0回答:1

我一直在尝试弄清楚如何使用数据存储,并尝试在点击检测器中编写一个脚本来保存零件的位置。当您重新加入并单击该部分时,会将立方体移动到该部分。这是我的脚本:

local DS  = game:GetService("DataStoreService")
local BoxPos = DS:GetDataStore("BoxPos")
script.Parent.MouseClick:Connect(function(plr)
    local boxData = BoxPos:GetAsync(plr.UserId)

    if boxData then

        workspace.Box.Position = Vector3.new(boxData:match("(.+), (.+), (.+)"))

    else

        BoxPos:SetAsync(plr.UserId,000)
    
    end
end)
game.Players.PlayerRemoving:Connect(function(plr)
    local boxPos = workspace.Box.Position
    BoxPos:SetAsync(plr.UserId,tostring(BoxPos))
end)

我不知道问题是什么,因为我没有收到任何有关保存的错误,但是当我单击它时,它会将其移动到

"0,0,0"

lua scripting roblox saving-data
1个回答
0
投票

该问题是由 Vector3 的创建引起的:

假设我们有

P = Vector3.new(1,2,3)
。然后我们执行
tostring(P)
,返回
boxData = "1, 2, 3"

现在,当您 GetAsync 时,您使用

:match("(.+), (.+), (.+)")
,它返回一个字符串:“1 2 3”。将此变量传递给 Vector3.new 与:
Vector3.new("1 2 3")
相同。由于使用字符串无效,因此向量返回
0, 0, 0

相反,您想使用不同的函数。由于您需要一个参数表,因此我们可以使用

string:split
。因此,我们将得到
boxData:split(", ")
,它会返回
{"1","2","3"}

我们希望将这些数字作为单独的参数传递,而不是作为表格传递,因此我们可以用

unpack()
来包裹它。

完整的代码是:

if boxData then
    workspace.Box.Position = Vector3.new(unpack(boxData:split(", ")))
else
    BoxPos:SetAsync(plr.UserId, nil)
end

让我知道它是否有效 - 如果没有,请不要犹豫发表评论!

© www.soinside.com 2019 - 2024. All rights reserved.