local DataStoreService = game:GetService("DataStoreService")
local DataBase = DataStoreService:GetDataStore("data")
local sessionData = {}
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(Player)
Player.CharacterAdded:Connect(function(Character)
Character.Humanoid.JumpHeight = 275
end)
local leaderstats = Instance.new("Folder", Player)
leaderstats.Name = "leaderstats"
local FolderOfValues = Instance.new("Folder",leaderstats)
FolderOfValues.Name = "FolderOfValues"
local Coins = Instance.new("IntValue", FolderOfValues)
Coins.Name = "Coins"
local Gravity = Instance.new("IntValue", FolderOfValues)
Gravity.Name = "Gravity"
local success = nil
local PlayerData = nil
local attempt = 1
repeat
success, PlayerData = pcall(function()
return DataBase:GetAsync(Player.UserId, sessionData[Player.UserId])
end)
attempt += 1
if not success then
warn(PlayerData)
task.wait(2)
end
until success or attempt == 5
if success then
print("Players data connected")
if not PlayerData then
print("Assigning default data")
PlayerData = {
["Coins"] = 0,
["Gravity"] = 10
}
end
sessionData[Player.UserId] = PlayerData
else
warn("Unable to get data for the player")
Player:Kick("Unable to load your data, try again next time")
end
workspace.Gravity = Gravity.Value
Coins.Value = sessionData[Player.UserId].Coins
Coins.Changed:Connect(function()
sessionData[Player.UserId].Coins = Coins.Value
end)
Gravity.Value = sessionData[Player.UserId].Gravity
Gravity.Changed:Connect(function()
sessionData[Player.UserId].Gravity = Gravity.Value
end)
end)
function PlayerLeaving(Player)
if sessionData[Player.UserId] then
local success = nil
local errormsg = nil
local attempt = 1
repeat
success, errormsg = pcall(function()
DataBase:SetAsync(Player.UserId, sessionData[Player.UserId])
end)
attempt += 1
if not success then
warn(errormsg)
task.wait(3)
end
until success or attempt == 5
if success then
print("Data saved")
else
warn("Not saved")
end
end
end
game.Players.PlayerRemoving:Connect(PlayerLeaving)
function ServerShutDown()
print("Server Shutting down")
RunService:IsStudio(function()
return
end)
for i, Player in ipairs(game.Players:GetChildren()) do
task.spawn(function()
PlayerLeaving(Player)
end)
end
end
game:BindToClose(ServerShutDown)
当我在没有数据的情况下进入游戏时,即使我没有任何进展,它也会打印“玩家的数据已连接”。当我带着进度离开时,没有任何打印表明我的数据尚未保存。我加入后就什么都没有了。我读过 10 篇不同的帖子,但没有一个对我有帮助。请有人帮忙!
假设您在工作室,您是否启用了工作室测试的 API 访问权限? 如果没有,您将无法访问实际发布的游戏使用的数据存储。
当我阅读我们的脚本时,我发现您使用了带有两个参数的 GetAsync,而只有一个参数。这很可能不会在玩家第一次加入时造成问题,因为它将返回 nil,但玩家第二次加入时,因为此时已填充,可能会导致随机的不需要的行为。
我建议您还将玩家的用户 ID 分配给本地变量,因为当脚本仍在运行时,玩家将被取消引用并返回 nil,这很可能会导致您的问题。