Roblox GUI Maker
← 全部教程

菜单

如何制作 Roblox 兑换码 GUI

兑换码面板让玩家输入一个兑换码或创作者码并领取奖励。界面很简单 —— 一个 TextBox 加一个兑换按钮 —— 但安全是单向的:客户端只发送码,由服务器决定是否有效并发放奖励。本指南用 Luau 搭好两端。

打开兑换码 模板 →

1. TextBox 输入和兑换按钮

TextBox 收集码,TextButton 发起请求。点击时读取输入框文本,通过 RemoteEvent 发给服务器。

local box = Instance.new("TextBox")
box.Size = UDim2.fromScale(1, 0.12)
box.PlaceholderText = "Enter code"
box.Parent = panel

local redeem = Instance.new("TextButton")
redeem.Size = UDim2.fromScale(1, 0.12)
redeem.Text = "REDEEM"
redeem.Parent = panel

local redeemEvent = game:GetService("ReplicatedStorage")
	:WaitForChild("Remotes"):WaitForChild("RedeemCode")
redeem.Activated:Connect(function()
	redeemEvent:FireServer(box.Text)
end)

2. 在服务端校验兑换码

把有效码及其奖励放在一个服务端 Script 里。对传入的码做规范化(转大写、去空格),查表,未知就忽略。客户端永远看不到这个列表。

local codes = {
	LAUNCHDAY = { coins = 500 },
	WELCOME = { item = "starter_crate" },
}

redeemEvent.OnServerEvent:Connect(function(player, raw)
	local code = string.upper(tostring(raw):gsub("%s+", ""))
	local reward = codes[code]
	if not reward then return end -- invalid code: do nothing
	grantReward(player, reward)
end)
提示: 永远不要信任客户端。只有服务器知道哪些码有效,也必须由它来发放金币或物品。

3. 把结果反馈给玩家

发放后,通过 RemoteEvent(或 RemoteFunction 返回)回传客户端,让 UI 显示“已领取奖励”或“兑换码无效”。奖励逻辑留在服务端,提示信息留在客户端。

常见问题

为什么必须由服务器校验兑换码?

客户端可能被作弊者修改。如果由客户端决定奖励,任何人都能给自己发任何东西。服务器才是有效码和已发奖励的唯一真相来源。

怎么让兑换码过期或只能用一次?

在 DataStore 里按玩家记录兑换情况(或在全局过期后从表里移除该码)。发放前在服务端检查。

相关教程