← 全部教程
商店
如何制作 Roblox 商店 GUI
一个商店需要三样东西:一个可滚动区域、自动排成网格的物品,以及一个让购买真正发生的途径。本指南用 ScrollingFrame + UIGridLayout 搭界面,再通过 RemoteEvent 接好购买动作让服务器校验它。从商店模板开始可以跳过布局工作。
打开商店 模板 →1. 面板和可滚动网格
一个 Frame 装下所有东西;ScrollingFrame 是放物品的地方。给 ScrollingFrame 加一个 UIGridLayout,每个物品格就会自动平铺成网格 —— 加多少物品都会重排。
local panel = Instance.new("Frame")
panel.Size = UDim2.fromScale(0.6, 0.76)
panel.Position = UDim2.fromScale(0.2, 0.12)
panel.Parent = gui
local scroll = Instance.new("ScrollingFrame")
scroll.Size = UDim2.fromScale(1, 0.8)
scroll.BackgroundTransparency = 1
scroll.ScrollBarThickness = 6
scroll.Parent = panel
local grid = Instance.new("UIGridLayout")
grid.CellSize = UDim2.fromOffset(120, 120)
grid.CellPadding = UDim2.fromOffset(10, 10)
grid.Parent = scroll2. 一个物品格
每个物品是一个 Frame,带一个 ImageLabel、一个价格标签和一个购买按钮。因为有 UIGridLayout,只要把它挂到 ScrollingFrame 下就自动落位到网格里。
local function makeItem(name, price, imageId)
local cell = Instance.new("TextButton")
cell.Text = ""
cell.BackgroundColor3 = Color3.fromRGB(40, 41, 51)
cell.Parent = scroll
local icon = Instance.new("ImageLabel")
icon.Size = UDim2.fromScale(1, 0.7)
icon.BackgroundTransparency = 1
icon.Image = "rbxassetid://" .. imageId
icon.Parent = cell
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 0.3)
label.Position = UDim2.fromScale(0, 0.7)
label.BackgroundTransparency = 1
label.Text = name .. " - " .. price
label.Parent = cell
return cell
end3. 通过 RemoteEvent 接通购买
永远不要把钱财交给客户端。购买按钮触发一个 RemoteEvent;服务器检查玩家买得起、扣除货币、发放物品。
-- LocalScript (client)
buyRemote = game.ReplicatedStorage:WaitForChild("BuyItem")
cell.MouseButton1Click:Connect(function()
buyRemote:FireServer(itemId)
end)
-- Script (server)
buyRemote.OnServerEvent:Connect(function(player, itemId)
-- verify currency, deduct, grant item
end)提示: 购买永远在服务端校验。客户端可以用任意 itemId 触发 RemoteEvent,所以服务器必须重新核对价格和归属。
常见问题
怎么让商店平滑滚动?
用带 AutomaticCanvasSize = Enum.AutomaticSize.Y 的 ScrollingFrame,再用 UISizeConstraint 或 UIGridLayout 的格子来定义高度。ScrollBarThickness 控制滚动条宽度。
物品怎么排成网格?
给 ScrollingFrame 挂一个 UIGridLayout。设 CellSize 和 CellPadding;每个子 Frame 就会自动排成行列。
