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

如何在Roblox Studio中获取玩家服装库存?技术求助

Roblox Studio获取玩家服装库存并实现服装验证门方案

问题原因

player:GetInventory()是已废弃的方法,Roblox目前不再支持通过Player对象直接调用该接口获取库存,必须使用MarketplaceService的官方API来实现。

正确实现步骤

1. 核心API说明

使用MarketplaceService:GetUserInventoryAsync(userId)获取玩家完整库存,该方法仅能在服务器端脚本中调用(涉及用户隐私数据,客户端无权限访问),返回结果包含玩家所有拥有的资产,需过滤出服装类资产:

  • AssetTypeId == 8:衬衫(Shirt)
  • AssetTypeId == 9:裤子(Pants)
  • AssetTypeId == 11:Avatar套装(Avatar Outfit)

2. 完整代码实现

在ServerScriptService或门对象上挂载服务器脚本,示例代码如下:

local MarketplaceService = game:GetService("MarketplaceService")
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

-- 替换为你允许通过的服装ID列表(支持衬衫、裤子、Avatar套装)
local ALLOWED_ASSET_IDS = {123456789, 987654321}

-- 获取玩家的服装库存
local function getPlayerClothing(player)
    local clothingInventory = {}
    local success, result = pcall(function()
        return MarketplaceService:GetUserInventoryAsync(player.UserId)
    end)

    if success then
        -- 过滤出服装类资产
        for _, asset in ipairs(result) do
            local assetType = asset.AssetTypeId
            if assetType == 8 or assetType == 9 or assetType == 11 then
                table.insert(clothingInventory, asset.AssetId)
            end
        end
    else
        warn(string.format("获取玩家%s库存失败: %s", player.Name, result))
    end
    return clothingInventory
end

-- 验证玩家是否拥有指定服装
local function hasAccess(player)
    local playerClothing = getPlayerClothing(player)
    for _, allowedId in ipairs(ALLOWED_ASSET_IDS) do
        if table.find(playerClothing, allowedId) then
            return true
        end
    end
    return false
end

-- 门触碰逻辑
local function handleDoorTouch(hit)
    local character = hit.Parent
    local player = Players:GetPlayerFromCharacter(character)
    if not player then return end

    local door = script.Parent
    local canEnter = hasAccess(player)

    if canEnter then
        -- 执行开门逻辑(示例:透明+取消碰撞)
        door.Transparency = 0.5
        door.CanCollide = false
        task.wait(3)
        door.Transparency = 0
        door.CanCollide = true
    else
        -- 客户端提示无权限(需提前在ReplicatedStorage创建RemoteEvent)
        local notifyEvent = ReplicatedStorage:FindFirstChild("NoAccessNotify")
        if notifyEvent then
            notifyEvent:FireClient(player, "你没有所需服装,无法进入!")
        end
    end
end

-- 绑定触碰事件
script.Parent.Touched:Connect(handleDoorTouch)

3. 客户端提示补充(可选)

在ReplicatedStorage创建名为NoAccessNotify的RemoteEvent,然后在StarterPlayerScripts中添加客户端脚本:

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local StarterGui = game:GetService("StarterGui")

local notifyEvent = ReplicatedStorage:WaitForChild("NoAccessNotify")
notifyEvent.OnClientEvent:Connect(function(message)
    StarterGui:SetCore("SendNotification", {
        Title = "权限不足",
        Text = message,
        Duration = 3
    })
end)

注意事项

  • 必须在服务器端执行库存获取操作,客户端调用GetUserInventoryAsync会触发权限错误
  • 使用pcall包裹API调用,处理网络请求失败的异常情况
  • 若需检测玩家当前穿戴的服装而非库存,可直接读取角色中Shirt/Pants对象的AssetId属性,或调用player:GetCharacterAppearanceInfoAsync()获取当前穿戴的套装信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:30:47