← 全部教程
菜单
如何制作 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 里按玩家记录兑换情况(或在全局过期后从表里移除该码)。发放前在服务端检查。
