英文:
How to use Datastore to save player Values? (Roblox Studio)
问题
Kylaaa的建议解决了一些问题,但现在在运行此代码加入游戏后,我得到了一个新的错误。我以前从未使用过数据存储,所以非常感谢所有的帮助,谢谢!
local DataStoreService = game:GetService("DataStoreService")
local UpgradeDataStore = DataStoreService:GetDataStore("UpgradeDataStore")
game.Players.PlayerAdded:Connect(function(player)
local playerData = {clickValue = 0}
-- 从数据存储加载数据
local success, result = pcall(function()
return UpgradeDataStore:GetAsync(tostring(player.UserId))
})
-- 仅在玩家具有先前数据时加载
if success and result then
playerData = result
else
-- 处理加载错误
warn("无法为玩家 " .. player.Name .. " 加载数据:" .. errorMessage)
end
local clickNum = Instance.new("IntValue")
clickNum.Name = "clickValue"
clickNum.Value = clickNum or 1
clickNum.Parent = player
-- 当玩家离开时保存点击升级
player.CharacterRemoving:Connect(function()
local success, errorMessage = pcall(function()
playerData.clickValue = clickNum.Value
UpgradeDataStore:SetAsync(tostring(player.UserId), playerData)
end)
-- 处理保存错误
if not success then
warn("无法为玩家 " .. player.Name .. " 保存数据:" .. errorMessage)
end
end)
end)
现在每次运行此脚本时,我都会收到此错误:ServerScriptService.OnPlayerAdded:56: 试图将字符串与nil连接
英文:
Kylaaa's advice fixed something but now I get a new error in the Output after running this code on joining the game, I've never done datastore before so all the help is very much appreciated thank you!
local UpgradeDataStore = DataStoreService:GetDataStore("UpgradeDataStore")
game.Players.PlayerAdded:Connect(function(player)
local playerData ={clickValue = 0,}
-- Load data from DataStore
local success, result = pcall(function()
return UpgradeDataStore:GetAsync(tostring(player.UserId))
end)
-- only load if the player has previous data
if success and result then
playerData = result
else
-- Handle loading errors
warn("Failed to load data for player " .. player.Name .. ": " .. errorMessage)
end
local clickNum = Instance.new("IntValue")
clickNum.Name = "clickValue"
clickNum.Value = clickNum or 1
clickNum.Parent = player
-- Save the clicker upgrade when the player leaves
player.CharacterRemoving:Connect(function()
local success, errorMessage = pcall(function()
playerData.clickValue = clickNum.Value
UpgradeDataStore:SetAsync(tostring(player.UserId), playerData)
end)
-- Handle saving errors
if not success then
warn("Failed to save data for player " .. player.Name .. ": " .. errorMessage)
end
end)
end)
Now Everytime this script runs I get this error: ServerScriptService.OnPlayerAdded:56: attempt to concatenate string with nil
答案1
得分: 0
错误提示您,当玩家的角色死亡或从工作区移除时,某种原因导致playerData
为nil
。
当您初始化playerData
时,仅在数据存储加载失败时分配一个空表,但您并未考虑到数据存储成功返回空值的情况。您确实应该为其提供一个默认值,以供数据存储覆盖。
-- 使用默认值初始化playerData
local playerData = {
clickValue = 0,
}
-- 从DataStore加载数据
local success, result = pcall(function()
return UpgradeDataStore:GetAsync(tostring(player.UserId))
end)
-- 仅在玩家有先前数据时加载
if success and result then
playerData = result
elseif not success then
-- 处理加载错误
warn(string.format("无法为%s加载数据:%s", player.Name, result))
end
英文:
The error is telling you that when the player's character dies or is removed from the workspace, for some reason playerData
is nil
.
When you initialize playerData, you only assign an empty table if the data store fails to load, but you haven't accounted for the case that the data store successfully returns nothing. You really should give it a default value that the data store overrides.
-- initialize playerData with default values
local playerData = {
clickValue = 0,
}
-- Load data from DataStore
local success, result = pcall(function()
return UpgradeDataStore:GetAsync(tostring(player.UserId))
end)
-- only load if the player has previous data
if success and result then
playerData = result
elseif not success then
-- Handle loading errors
warn(string.format("Failed to load data for %s : %s", player.Name, result))
end
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论