When most people think of Roblox, they picture blocky characters and simple gameplay loops. We set out to shatter that perception entirely. Mech Showdown is a fast-paced, animation-driven mech fighting game built from the ground up on the Roblox platform — and building it pushed us to solve some genuinely hard engineering problems.

The Game at a Glance
Mech Showdown drops players into the cockpit of massive, meticulously animated mechs and pits them against each other in tight, skill-based combat. Think of it as a love letter to arena fighters and mech action games, but accessible to anyone on Roblox.
Players pick from a roster of unique mechs — each with their own weight class, weapon type, and ability kit — and battle it out in 1v1 ranked arenas, 2v2 team fights, gauntlet survival modes, and open-world lobbies. Every mech plays differently. Every match feels different. That was always the goal.
By the Numbers
Since launch, Mech Showdown has seen incredible traction from the Roblox community:
- Millions of visits across the game's lifetime
- Tens of thousands of concurrent players during peak events
- 9 fully unique weapon archetypes — from dual blades and gauntlet cannons to plasma guns and hammer launchers
- 74+ unique skills and abilities across the mech roster
- 160+ networked remote events powering the real-time combat system
- 819 Lua modules making up the full codebase
- A thriving competitive ranked scene with ELO-based matchmaking
These numbers didn't come easy. Every one of them represents an engineering challenge we had to solve, and solve well, to keep the experience feeling responsive and polished at scale.
The Mechs: More Than Just Characters
The heart of Mech Showdown is its roster. We didn't want generic fighters with swapped skins — we wanted each mech to feel fundamentally different to play.
Three Weight Classes, Completely Different Playstyles
Every mech falls into one of three weight classes, and the differences go far beyond just health and speed:
Light Mechs are fast and aggressive. With 140 base health and a walk speed of 65, they're built for players who want to weave in and out of combat, chain combos, and punish mistakes. They hit a little softer but they hit a lot more often. Their smaller hip height and tighter hitboxes make them genuinely harder to pin down.
Medium Mechs strike a balance at 120 health and 70 walk speed. They're the most versatile class — capable of zoning with ranged skills, holding ground with solid melee, or playing aggressively depending on the mech's specific kit. They're the class we point new players toward, but they have more than enough depth to reward mastery.
Heavy Mechs are the bruisers. At 160 health and a walk speed of 60, they're slower but devastating. Their larger cylinder scale (3.0x) means their attacks cover more ground, and their defensive stats let them trade blows that would flatten a lighter mech. Playing heavy is about patience, reads, and making every hit count.
Weapon Archetypes
Each mech wields a distinct weapon that defines their attack chains and combo flow:
- Sword & Shield — balanced offense and defense with guard options
- Gauntlet Cannon — hybrid melee-ranged with explosive punches
- Dual Blades — rapid slash combos with high mobility
- Claws — aggressive close-range with wide sweeps
- Bow Sword — versatile weapon that switches between ranged pokes and melee pressure
- Inferno Blade — fire-themed greatsword with burn effects
- Plasma Gun — projectile-focused kit for zoning and space control
- Hammer Launcher — slow, massive hits with launcher potential
Each weapon type has its own attack chain progression, hit frame timing, and animation set. A Claws mech doesn't just look different from a Hammer mech — the rhythm of combat is completely different.

74+ Skills and the Ability System
Every mech has access to 4 basic skill slots plus an ultimate ability, and each slot offers multiple skill options. This means players can customize their loadout to match their playstyle, even within the same mech.
Skills range from the visceral — Jump Slam, Wrecking Ball, Dragon Roar — to the tactical — Airstrike, Boomerang, Spearhead. Each skill is defined with precise attributes: cooldown timers, hit frame windows, synchronization flags, displacement values, camera shake intensity, and projectile speeds. Nothing is faked. Every skill is a precisely tuned piece of game design backed by real combat math.
The ultimate abilities take this further with per-mech addon controllers. Each ultimate has its own activation logic, custom state handling, and bespoke visual effects. When a player pops their ultimate, it should feel like the most powerful thing they can do — and we engineered each one to deliver on that promise.
The Tech: What It Took to Make It Feel Right
Making a fighting game feel good is one of the hardest problems in game development. Making a fighting game feel good over the network on a platform that wasn't originally designed for it? That's where things got really interesting.
The Dual-Layer State Machine
The backbone of Mech Showdown's combat is a dual-layer state machine — one running on the client, one on the server, working in lockstep.
On the client side, every mech is always in exactly one of these states:
- Locomotion — the default movement state
- Attack — basic melee combo chains
- Jump — vertical movement with its own physics
- Dash — directional dodge with 8 directions (forward, forward-left, left, back-right, etc.)
- Block — active defense with stun interaction
- Skill — ability activation with cooldown tracking
- Stun — crowd control state from guard breaks or heavy hits
- Ragdoll — full physics ragdoll with automatic recovery
- Jump Attack — a hybrid state for aerial combos
- Emote — because sometimes you just need to flex
- Death — elimination
Each state defines four critical functions: attemptEntry() (can I enter this state?), attemptExit() (can I leave my current state?), inFunction() (what happens when I enter), and outFunction() (what happens when I leave). This architecture means we can express complex combat rules cleanly. You can't dash while stunned. You can't block during an attack animation. You can't activate a skill while ragdolled. These aren't special-cased if statements scattered through the code — they're structural guarantees enforced by the state machine itself.
The server mirrors this entire system. When the client requests a state transition, the server independently validates it using its own state machine instance. If the transition is legal, it goes through. If not, the server corrects the client. This dual-authority model is what lets combat feel instantly responsive on the client while remaining cheat-resistant on the server.
Transition codes like ON_ATTACK, ON_SKILL, ON_DASH, ON_STUN, and ON_RAGDOLL provide a clean vocabulary for the entire combat system to speak. Any system — input handling, hit detection, AI — can request a state transition using these codes, and the state machine handles the rest.
Animation-Driven Combat
In many games, animations are cosmetic — they play on top of gameplay logic that's already decided the outcome. In Mech Showdown, animations drive the combat.
Every attack has precisely defined hit frames embedded in its animation data. The AnimationManagerServer preprocesses every animation track at load time, extracting speed, timing, and hit window data. When a player throws a punch, the hit doesn't register at the start of the animation or at some arbitrary delay — it registers at the exact frame the fist connects.
This preprocessing happens at startup through the PreProcessTrackEvent system. Animation data is cached per player, per mech, so there's zero runtime overhead from parsing animation metadata during actual combat. The result is combat that feels frame-accurate even though we're running on a platform that wasn't built for fighting games.
Root motion further sells the physicality. The CharacterMotionHandlerServer reads animation curves to drive character movement — a heavy overhead swing pulls the mech forward, a backstep dodge actually displaces them backward. Pushback calculations use easing functions over a 0.3-second duration to make impacts feel weighty without being jarring. When a heavy mech lands a hammer blow and the opponent slides backward, that's not a canned knockback value — it's a physics-informed displacement curve.
Matchmaking: ELO at Scale
Competitive integrity matters. We built a full ELO-based matchmaking system that balances match quality against queue times using progressive search windows.
Here's how it works: when a player queues up, the system starts looking for opponents within 50 ELO of their rating. If no match is found, it waits 15 seconds and widens to 100. Then 200 after another 15 seconds. Then 400 after 30 seconds. Then 800 after another 30 seconds. This progressive expansion means skilled players get fair matches quickly during peak hours, while still finding games within a reasonable timeframe during off-peak.
The system uses Roblox's MemoryStore for distributed queue management — player queue state is shared across all servers, so matchmaking operates globally, not per-server. Regional awareness through LocalizationService ensures players are matched with opponents in their geographic region when possible, minimizing latency.
Queue state management handles the messy edge cases that break most matchmaking implementations: players disconnecting mid-queue, duplicate queue entries, race conditions when two searches find the same player simultaneously. Each player's queue lifecycle is tracked through discrete promises (joinQueuePromise, addEloPromise, exitQueuePromise) with proper cleanup at every stage.
Once a match is found, the TeleportOptions system queues both players directly into a dedicated arena server. Matches run on a 20-second countdown with 5-second intervals between rounds. Winners earn 3,600 XP; losers still walk away with 2,400 XP — because we want players to keep queuing, not rage-quit after a loss.
Lag Compensation: Making Networked Combat Feel Local
This is arguably the hardest technical challenge in the entire project. Fighting games demand precision measured in frames. Network latency is measured in milliseconds — and on Roblox, those milliseconds can vary wildly.
Our TimeSync system continuously measures round-trip latency, pinging every 150 milliseconds and maintaining a rolling average of the last 3 measurements. Any reading above 2 seconds is rejected as anomalous. Duplicate and replayed responses are dropped. This gives us a reliable, up-to-date picture of each player's connection quality.
The ClientUpdates module uses this latency data for predictive hit validation. When a player lands a hit on their client, the server doesn't just trust or reject it — it predicts the outcome based on animation frame data and network conditions. The system knows where both players should be given the latency window, and validates accordingly.
We also implemented an action score system to handle the "trading hits" problem that plagues every networked fighting game. When two players attack simultaneously, an action score accumulates. At score bracket 4, damage is reduced to 80% (or 90% in open world). At bracket 6, it drops to 60% (or 80% in open world). The score resets after 1.5 seconds of non-trading. This prevents the degenerate gameplay pattern where both players just mash attack and trade hits endlessly — it forces spacing, timing, and defensive play.
Performance: Running Smoothly at Scale
A beautiful game that runs at 15 FPS isn't a good game. We obsessed over performance at every layer.
Collision optimization uses a multi-group system. Rather than checking every object against every other object, we separate the world into collision groups: Combat for hit detection, Destructable for environmental destruction, and DetectDestructables for destruction raycasting. OverlapParams and RaycastParams are scoped to specific groups, so a combat hit check never wastes cycles testing against destructible scenery.
The destruction system caches all destructible structures at startup rather than querying the world each frame. When a mech smashes through a wall (motion cast radius: 8 units), the system looks up the pre-cached structure, applies destruction, and queues a respawn after 20 seconds. A 5-second respawn check interval keeps the overhead minimal even with dozens of destroyed objects.
Animation preloading ensures that the first time a player uses a skill, there's no hitch. All animation tracks are loaded and cached when a player selects their mech, not when they first trigger an attack. The preprocessing pipeline extracts all timing data upfront, so combat playback is pure execution with zero parsing overhead.
The AI system for bot opponents uses a token-based resource allocation model. Rather than every bot independently deciding to attack (which would result in unrealistic dogpiling), a global AIManager distributes tokens: 2 attack tokens, 2 skill tokens, and 3 closeness tokens per player target. Bots must acquire a token before engaging, which creates natural combat flow where bots take turns pressuring and circling. This isn't just good game design — it's a massive performance win because it caps the number of simultaneous AI combat calculations.
The Client: React on Roblox
The entire UI layer is built with React (via the Roblox React library and ReactRoblox bindings). Menu navigation uses a StateStack pattern — screens push and pop like a navigation controller. App-wide state flows through a Subject-based reactive system in AppState.lua.
This might sound like over-engineering for a Roblox game, but it paid enormous dividends. The mech selection screen, skill loadout UI, battle pass progression, cosmetic equipment, ranked leaderboards, and in-match HUD all share the same state management patterns. When we need to add a new screen or feature, we're not reinventing data flow — we're plugging into a system that already works.
The in-match HUD renders skill cooldowns, health bars, combo counters, and lock-on indicators — all updating in real-time without frame drops. That's React's reconciliation doing its job: only the parts of the UI that actually changed get re-rendered.
Game Modes: Something for Everyone
Ranked 1v1
The core competitive experience. Two players, one arena, best-of-three rounds. ELO on the line. This is where the combat system shines brightest — no teammates to blame, no chaos to hide behind. Pure skill expression.
2v2 Team Battles
All the depth of 1v1 with the added dimension of team coordination. Team composition matters — pairing a Heavy mech's crowd control with a Light mech's combo pressure creates setups that neither could achieve alone.
Gauntlet Mode
Wave-based survival against AI opponents. The token-based AI system shines here, creating escalating pressure as waves progress. It's the best way to learn a new mech's kit in a lower-stakes environment.
Training Zone
A guided onboarding experience with progress tracking. New players learn movement, combat fundamentals, skill usage, and defensive play through structured challenges. Training progress is tracked server-side and rewarded with XP, so there's a real incentive to complete it.
Open World Lobby
The social hub. Players can free-roam, practice combos on destructible environments, emote, and challenge others to informal matches. The different damage negation values (90%/80% at action score brackets vs 80%/60% in ranked) keep lobby fights fun without the intensity of ranked.
Progression and Player Investment
Mech Showdown's progression systems give players reasons to keep coming back:
- Mech Unlocks — start with a core roster and unlock new mechs through gameplay
- Skill Loadouts — customize each mech's 4 ability slots from multiple options per slot
- Cosmetics — visual customization that doesn't affect gameplay
- Emotes and Finishers — style expression for pre and post-match
- Battle Pass — seasonal content with free and premium tracks
- Ranked ELO — a persistent competitive rating that tracks your improvement over time
- Win/Loss Stats — detailed stat tracking per player
Player data is persisted through a PlayerDocument system that handles serialization, versioning, and edge cases like data corruption or save failures. When a player's rank, unlocks, and loadouts are at stake, data integrity isn't optional.
What We Learned
Building Mech Showdown taught us that the ceiling on Roblox is far higher than most developers assume. The platform's constraints are real — you're working in Lua, you don't control the network layer, and you're running inside someone else's engine. But those constraints force creative solutions.
Our dual-layer state machine exists because we can't trust the client but also can't tolerate input lag. Our animation-driven combat exists because we needed frame-precise hit detection without engine-level access. Our progressive ELO matchmaking exists because a small-but-dedicated playerbase can't afford the queue times of a rigid matching system.
Every technical decision in this codebase was driven by a single question: does this make the game feel better to play? Not "is this architecturally elegant" (though often it is). Not "is this the theoretically optimal solution" (though often it's close). Just: does it feel right when you press the button and your mech swings its sword?
We think the answer is yes. But don't take our word for it — go play it yourself.
Mech Showdown is developed by Neureal. Free to play on Roblox.