Roblox GUI Maker
← 全部教程

商店

如何制作 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 = scroll

2. 一个物品格

每个物品是一个 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
end

3. 通过 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 就会自动排成行列。