You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:01:17