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
相关产品推荐
相关产品推荐

