关于 roblox-game-systems
面向 Roblox 游戏开发的技能指南,提供成长、回合、战斗和物品栏等常见系统的设计方案。重点涵盖服务端权威状态、校验客户端请求、数据配置与生命周期处理。
主要功能
- 01成长与奖励系统方案
- 02回合、队伍与生成方案
- 03服务端校验战斗方案
- 04物品栏、商店与宠物方案
- 05生命周期与配置检查清单
适用场景
- 01设计货币或经验值系统
- 02规划回合制对局
- 03设计经过校验的战斗交互
- 04检查新系统的生命周期需求
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ el4cteo/ roblox-skills --skill roblox-game-systems安装后在 Claude Code 中输入/roblox-game-systems确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/combat.mdinventory-shop.mdprogression.mdround-system.md详细介绍
游戏系统配方
每个配方都遵循相同的约定:
- 状态位于服务端,放在服务模块中;持久化部分通过数据层
(
roblox-data-stores)处理。 - 客户端发送意图,通过经过验证、限流的 remote(
roblox-security、roblox-networking)发送,并渲染它们接收到的状态(属性、快照/增量)。 - 配置即数据:可调参数放在共享/服务端配置模块中(或使用实时
ConfigService配置)。 - 生命周期安全:处理晚加入、重生、操作中途离开以及服务器关闭。
| 系统 | 参考 |
|---|---|
| Leaderstats、货币服务、XP/等级、每日奖励、obby 检查点 | references/progression.md |
| 回合循环(间歇 → 对局 → 结果)、队伍、生成 | references/round-system.md |
| 带服务器验证的近战和远程战斗、冷却、伤害归属 | references/combat.md |
| 库存、装备工具、商店购买(软货币)、跟随宠物 | references/inventory-shop.md |
货币服务(所有经济系统都采用的模式)
--!strict
-- ServerScriptService/Server/Services/CurrencyService.luau
local Players = game:GetService("Players")
type Balances = { [Player]: number }
local MAX_BALANCE = 1e12
local CurrencyService = {}
local balances: Balances = {}
local function publish(player: Player)
player:SetAttribute("Coins", balances[player]) -- replicated to every client; UI listens
end
function CurrencyService.load(player: Player, saved: number?)
balances[player] = math.clamp(saved or 0, 0, MAX_BALANCE)
publish(player)
end
function CurrencyService.get(player: Player): number
return balances[player] or 0
end
-- Positive amount only; returns the new balance.
function CurrencyService.add(player: Player, amount: number, _source: string): number?
local balance = balances[player]
if balance == nil or not math.isfinite(amount) or amount <= 0 then
return nil
end
balances[player] = math.min(balance + math.floor(amount), MAX_BALANCE)
publish(player)
return balances[player]
end
-- Atomic check-and-spend; false if insufficient.
function CurrencyService.spend(player: Player, amount: number, _sink: string): boolean
local balance = balances[player]
if balance == nil or not math.isfinite(amount) or amount <= 0 or balance < amount then
return false
end
balances[player] = balance - math.floor(amount)
publish(player)
return true
end
Players.PlayerRemoving:Connect(function(player)
balances[player] = nil -- after the data layer has saved it
end)
return CurrencyService
- 每种资源只由一个模块拥有;其他任何地方都不能写入它。将来源/去向记录到分析
(
roblox-analytics-liveops)。 - 内存中的余额由数据层保存(ProfileStore
profile.Data.coins)——或者直接让 profile 表作为余额存储。 - 显示方面,客户端读取
player:GetAttribute("Coins")和GetAttributeChangedSignal("Coins")。leaderstats(玩家下的一个包含IntValue的 Folder)会在玩家列表中显示数值。
任何新系统的设计检查清单
- 权威状态存放在哪里,以及如何持久化?
- 客户端可以请求什么,以及每个请求如何验证和限流?
- 在会话中途加入、重生、离开、传送和服务器关闭时会发生什么?
- 如何调整它(配置)以及如何衡量它(分析)?
- 在 1 名玩家、满员服务器和高延迟下它的行为如何?
- 它在客户端上是否流式安全?
相关技能
roblox-architecture、roblox-security、roblox-data-stores、roblox-networking、
roblox-characters-animation、roblox-monetization、roblox-ui。
评论
支持 Markdown