无法分配 属性 值。预期字符串,得到实例

Unable to assign property Value. string expected, got Instance

值有问题。它说 'Unable to assign property Value. string expected, got Instance'。有人知道怎么解决吗?

local DataStoreService = game:GetService("DataStoreService")
local RankStore = DataStoreService:GetDataStore("RankStore")
local players = game:GetService("Players")

players.PlayerAdded:Connect(function(Player)
    local UserId = Player.UserId
    local Rank = RankStore:GetAsync(UserId)
    
    if Rank == nil then
        Rank = "-"
        RankStore:SetAsync(UserId, Rank)
    end
    local leaderstats = Instance.new("Folder", Player)
    leaderstats.Name = "leaderstats"
    local Rank = Instance.new("StringValue", leaderstats)
    Rank.Name = "Rank"
    Rank.Value = Rank
    
    Rank.Changed:Connect(function(NewRank)
        RankStore:SetAsync(UserId, NewRank)
    end)
end)

让我们逐步了解正在发生的事情。第一

local Rank = RankStore:GetAsync(UserId)

您将 Rank 定义为数据存储查找的结果。然后

if Rank == nil then
    Rank = "-"
    RankStore:SetAsync(UserId, Rank)
end

如果您没有得到任何回复,可能是因为它是新玩家,您可以将 Rank 设置为字符串 "-"。此时,Rank 的值可能是 "-" 或之前保存在那里的任何值。

local Rank = Instance.new("StringValue", leaderstats)
Rank.Name = "Rank"

您用新的定义覆盖了以前的值;您创建一个 StringValue 实例并将其分配给 Rank。此时,当您请求变量 Rank 时,它指向 StringValue.

Rank.Value = Rank

在这里,您的代码抛出了错误。您正在尝试将 StringValue 的值 属性(应该是一个字符串)分配给 StringValue 本身的实例。

要解决此问题,您需要更加小心地命名变量,并避免命名冲突。最简单的解决方案是将 StringValue 重命名为其他名称:

local RankStatsValue = Instance.new("StringValue", leaderstats)
RankStatsValue.Name = "Rank"
RankStatsValue.Value = Rank

RankStatsValue.Changed:Connect( function(NewRank)