我一直在尝试弄清楚如何使用数据存储,并尝试在点击检测器中编写一个脚本来保存零件的位置。当您重新加入并单击该部分时,会将立方体移动到该部分。这是我的脚本:
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"
该问题是由 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
让我知道它是否有效 - 如果没有,请不要犹豫发表评论!