开发游戏的时候,有时候会需要区分不同国家和地区,这里以排行榜为例分享下方法
首先在玩家加入游戏时判断其是否为中国玩家
local Players = game:GetService("Players") local Policy = game:GetService("PolicyService") Players.PlayerAdded:Connect(function(player) local ChinaInfo = Policy:GetPolicyInfoForPlayerAsync(player) if ChinaInfo.IsSubjectToChinaPolicies then --判断结果为中国玩家,做一些特殊的操作 else --判断结果为其他地区,做另外的操作 end end)
然后下面是我写的一个排行榜代码,稍微改下就可以拿去用
这个排行榜显示的是所有服务器,包括离线玩家的数据排行
local DataStoreService = game:GetService("DataStoreService") local BestLeaderboard = DataStoreService:GetOrderedDataStore("BestLeaderboard") local function updateLeaderboard() local success, errorMessage = pcall (function() local Data = BestLeaderboard:GetSortedAsync(false, 10) local BestPage = Data:GetCurrentPage() for Rank, data in ipairs(BestPage) do local userName = game.Players:GetNameFromUserIdAsync(tonumber(data.key)) local Name = userName local Best = data.value local isOnLeaderboard = false for i, v in pairs(game.Workspace.GlobalLeaderboard.LeaderboardGUI.Holder:GetChildren()) do if v.Player.Text == Name then isOnLeaderboard = true break end end if Best and isOnLeaderboard == false then local newLbFrame = game.ReplicatedStorage:WaitForChild("LeaderboardFrame"):Clone() newLbFrame.Player.Text = Name newLbFrame.Best.Text = Best newLbFrame.Rank.Text = "#"..Rank newLbFrame.Position = UDim2.new(0, 0, newLbFrame.Position.Y.Scale + (.1 * #game.Workspace.GlobalLeaderboard.LeaderboardGUI.Holder:GetChildren()), 0) newLbFrame.Parent = game.Workspace.GlobalLeaderboard.LeaderboardGUI.Holder end end end) if not success then print(errorMessage) end end while true do for _, player in pairs(game.Players:GetPlayers()) do BestLeaderboard:SetAsync(player.UserId, player.leaderstats.Best.Value) end for _, frame in pairs (game.Workspace.GlobalLeaderboard.LeaderboardGUI.Holder:GetChildren()) do frame:Destroy() end updateLeaderboard() print("Updated!") wait(300) end
我们需要做的就是为中文玩家单独做一个排行榜,
把使用不同语言的玩家存到这两个排行榜里,
然后在玩家加入游戏时判断,显示对应的排行榜
由于各个游戏的排行榜实现方式不同,这里的代码仅为示例,
并不能直接使用,请结合两段代码自行修改。
学会了吗?