mcpField
R
roblox-game-systems

roblox-game-systems

github.com/el4cteo开发54504 次安装2 周前更新
代码仓库

关于 roblox-game-systems

面向 Roblox 游戏开发的技能指南,提供成长、回合、战斗和物品栏等常见系统的设计方案。重点涵盖服务端权威状态、校验客户端请求、数据配置与生命周期处理。

主要功能

  1. 01成长与奖励系统方案
  2. 02回合、队伍与生成方案
  3. 03服务端校验战斗方案
  4. 04物品栏、商店与宠物方案
  5. 05生命周期与配置检查清单

适用场景

  1. 01设计货币或经验值系统
  2. 02规划回合制对局
  3. 03设计经过校验的战斗交互
  4. 04检查新系统的生命周期需求

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/el4cteo/roblox-skills --skill roblox-game-systems

安装后在 Claude Code 中输入/roblox-game-systems确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
combat.md
inventory-shop.md
progression.md
round-system.md

详细介绍

游戏系统配方

每个配方都遵循相同的约定:

  1. 状态位于服务端,放在服务模块中;持久化部分通过数据层 (roblox-data-stores)处理。
  2. 客户端发送意图,通过经过验证、限流的 remote(roblox-security、 roblox-networking)发送,并渲染它们接收到的状态(属性、快照/增量)。
  3. 配置即数据:可调参数放在共享/服务端配置模块中(或使用实时 ConfigService 配置)。
  4. 生命周期安全:处理晚加入、重生、操作中途离开以及服务器关闭。
系统参考
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