← 全部教程
菜单
如何制作 Roblox 每日奖励 GUI
每日奖励界面显示一排天数卡片 —— 已领的天数变暗、今天可领、未来的天数锁定 —— 加一个领取按钮。视觉状态只是背景色的区别;真正的逻辑在服务端:记录玩家上次领取的时间和连签天数,只有进入了新一天才发放奖励。
打开每日奖励 模板 →1. 一个带视觉状态的 7 天网格
每天是一个按状态上色的 Frame:已领(变暗)、当日(高亮)、未解锁(弱化)。用 UIListLayout 或手动位置排列 —— 编辑器的 daily-rewards 模板已经替你做好了。
2. 在服务端追踪连签
按玩家存储 lastClaimTime 和 streak(DataStore)。收到领取请求时,把服务器时间和上次领取对比:不到一天就忽略;在两天以内就推进连签;否则重置为第 1 天。
local DAY = 86400
claimEvent.OnServerEvent:Connect(function(player)
local data = playerData[player.UserId] -- { last = 0, streak = 0 }
local now = os.time()
if now - data.last < DAY then return end -- already claimed today
data.streak = (now - data.last < 2 * DAY) and data.streak + 1 or 1
data.last = now
grantDayReward(player, data.streak)
end)提示: 天的边界永远用 os.time()(服务器时钟)。客户端的时钟可能不准或被篡改。
3. 把结果反映到 UI
服务器发放后,把新的连签天数和上次领取日告诉客户端。客户端重新给天数卡片上色(把今天标为已领、高亮明天),让日历和服务端的真实状态保持同步。
常见问题
怎么在多次会话间保存连签?
把 lastClaimTime 和 streak 存到按 UserId 索引的 DataStore 里。玩家加入时加载,每次领取后保存。
玩家漏了一天会怎样?
由你决定:把连签重置为 1,或者在宽限期内(比如两天)保留。上面的代码在隔了两天后重置。
