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

Roblox Gamepass购买弹窗不显示问题(无报错)

问题排查与修复方案

直接给你梳理代码里的致命问题——这就是弹窗不显示且无报错的核心原因:

  • 函数名拼写错误:定义的函数是PromtPurchase(首字母P大写),但递归调用时写成promtPurchase(首字母p小写),调用失败的错误被pcall吞掉,所以输出面板没提示。
  • 通行证拥有状态判断逻辑完全错误:你用PromptGamePassPurchase(弹窗方法)来判断玩家是否有通行证,这完全不对——判断状态应该用UserOwnsGamePassAsync,而且代码里变量名还写成hasspass(多了个s),和定义的haspass不匹配,等于白做判断。
  • PromptGamePassPurchase参数错误:这个方法第一个参数必须是Player对象,你一开始传了players.UserId(数字类型),调用直接失败,同样被pcall掩盖了错误。
  • 无限递归无终止条件:就算前面的问题都修复,每1秒递归调用一次函数会导致无限循环,轻则卡性能,重则脚本崩溃。
  • LocalPlayer使用场景错误:如果这是服务器脚本,game.Players.LocalPlayer根本取不到值——LocalPlayer只能在客户端脚本里用;服务器脚本得通过PlayerAdded事件监听玩家进入。

修复后的代码

分两种场景给你:

客户端脚本(放在StarterPlayerScripts/StarterPack等客户端容器)

local MarketplaceService = game:GetService("MarketplaceService")
local GamePassId = 11585012233
local Player = game.Players.LocalPlayer

-- 检查玩家是否拥有通行证
local function hasGamePass()
    local success, result = pcall(function()
        return MarketplaceService:UserOwnsGamePassAsync(Player.UserId, GamePassId)
    end)
    if not success then
        warn("检查通行证失败: " .. result)
        return false
    end
    return result
end

-- 触发购买提示的函数
local function promptPurchase()
    if not hasGamePass() then
        MarketplaceService:PromptGamePassPurchase(Player, GamePassId)
        -- 监听购买完成事件,避免重复弹窗
        MarketplaceService.PromptGamePassPurchaseFinished:Connect(function(player, passId, wasPurchased)
            if player == Player and passId == GamePassId then
                if wasPurchased then
                    print("玩家成功购买通行证")
                end
            end
        end)
    else
        print("玩家已拥有通行证")
    end
end

-- 玩家进入游戏时触发
promptPurchase()

服务器脚本(放在ServerScriptService)

local MarketplaceService = game:GetService("MarketplaceService")
local GamePassId = 11585012233

-- 监听玩家进入事件
game.Players.PlayerAdded:Connect(function(player)
    -- 检查玩家是否拥有通行证
    local function hasGamePass()
        local success, result = pcall(function()
            return MarketplaceService:UserOwnsGamePassAsync(player.UserId, GamePassId)
        end)
        if not success then
            warn("检查玩家 " .. player.Name .. " 的通行证失败: " .. result)
            return false
        end
        return result
    end

    -- 触发购买提示(服务器端触发也会在客户端弹窗)
    if not hasGamePass() then
        MarketplaceService:PromptGamePassPurchase(player, GamePassId)
        
        MarketplaceService.PromptGamePassPurchaseFinished:Connect(function(p, passId, wasPurchased)
            if p == player and passId == GamePassId then
                if wasPurchased then
                    print(player.Name .. " 成功购买通行证")
                    -- 这里可以添加给玩家发放通行证权益的逻辑
                end
            end
        end)
    else
        print(player.Name .. " 已拥有通行证")
    end
end)

额外注意事项

  • 确保你的GamePassId正确且已在Roblox开发者平台发布。
  • 客户端脚本不要处理通行证权益发放(容易被篡改),权益发放必须放在服务器脚本里,通过PromptGamePassPurchaseFinished事件验证后执行。
  • 不要用无终止的递归循环,需要重复弹窗的话可以用while wait(60) do这种带间隔的循环,且要加判断条件(比如玩家还没购买时才弹窗)。

内容的提问来源于stack exchange,提问作者therealweldtool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:45:36