如何在Roblox Studio中实现仅持有GamePass用户可见的专属GUI?
解决Roblox GamePass专属菜单全服显示问题
问题根源
你的脚本错误地修改了StarterGui中的界面元素——StarterGui是所有玩家界面的全局模板,任何对它的修改都会同步到服务器内所有玩家的PlayerGui中,这就是为什么一个玩家购买后所有人的菜单都被激活的原因。正确的做法是针对单个玩家的PlayerGui进行操作,而非全局模板。
解决方案1:服务器端处理(推荐用于需要严格验证的场景)
将以下脚本放在ServerScriptService中,它会针对每个玩家单独验证GamePass权限,并修改该玩家专属的PlayerGui:
local MarketplaceService = game:GetService("MarketplaceService") local Players = game:GetService("Players") local GAME_PASS_ID = 100725261 -- 玩家加入时验证权限并初始化界面 Players.PlayerAdded:Connect(function(player) -- 等待玩家的PlayerGui加载完成 local playerGui = player:WaitForChild("PlayerGui") local screenGui = playerGui:WaitForChild("ScreenGui") local menu = screenGui:WaitForChild("TPMenu") -- 安全验证玩家是否持有GamePass local success, ownsPass = pcall(function() return MarketplaceService:UserOwnsGamePassAsync(player.UserId, GAME_PASS_ID) end) if success and ownsPass then menu.Visible = true else menu.Visible = false end end) -- 处理玩家实时购买GamePass后的界面更新 MarketplaceService.PromptGamePassPurchaseFinished:Connect(function(player, gamePassId, wasPurchased) if gamePassId == GAME_PASS_ID and wasPurchased then local playerGui = player:FindFirstChild("PlayerGui") if playerGui then local menu = playerGui:FindFirstChild("ScreenGui"):FindFirstChild("TPMenu") if menu then menu.Visible = true end end end end)
解决方案2:客户端LocalScript处理(更轻量化)
将以下脚本放在PlayerGui.ScreenGui中,直接在玩家本地验证权限并控制界面,不会影响其他玩家:
local MarketplaceService = game:GetService("MarketplaceService") local Players = game:GetService("Players") local GAME_PASS_ID = 100725261 local menu = script.Parent.TPMenu menu.Visible = false -- 默认隐藏菜单 local player = Players.LocalPlayer -- 初始化验证权限 local success, ownsPass = pcall(function() return MarketplaceService:UserOwnsGamePassAsync(player.UserId, GAME_PASS_ID) end) if success and ownsPass then menu.Visible = true end -- 监听实时购买事件,更新界面 MarketplaceService.PromptGamePassPurchaseFinished:Connect(function(purchasedPlayer, gamePassId, wasPurchased) if purchasedPlayer == player and gamePassId == GAME_PASS_ID and wasPurchased then menu.Visible = true end end)
注意:如果菜单包含需要服务器执行的功能(比如传送、道具发放),服务器端必须再次验证玩家的GamePass权限,防止客户端作弊。
内容的提问来源于stack exchange,提问作者Ywha
相关产品推荐
相关产品推荐

