Controls
In short
Mouse aims. Space, left click or gamepad A swings. A/D and W/S held at contact aim the hit. The swing button also skips replays and dead time. Esc pauses. In the batting cage, Tab changes the pitch and M changes the park. The HUD shows the hints: MOUSE AIM, SPACE / CLICK SWING, A/D W/S AIM HIT, ESC PAUSE.
How it works
Batting
| Input | What it does |
|---|---|
| Mouse | Moves the aim helper (its sweet spot) on the plate (clamped to x +/-0.7 m, height 0.1 to 1.6 m). Speed set by AIM SPEED |
| Space / left click / gamepad A | Swings, once per pitch, only after the ball is released and not while paused |
| A / D (left / right arrow) | Held at contact: aims the hit up to 15 degrees toward left field (PULL) / right field (OPPO), and which way it curves |
| W / S (up / down arrow) | Held at contact: W (LIFT) higher launch odds, x0.94 power; S (DRIVE) lower launch odds, x1.05 power |
| Gamepad left stick | Same as A/D and W/S, partly tilted for part of the effect |
| Esc | Pauses or resumes (only in an at-bat) |
The swing is timestamped: the game uses the moment the button went down, not the frame it was noticed. The held direction is read at the moment of contact. A box above the key hints lights the held direction (PULL / NORMAL / OPPO, DRIVE / NORMAL / LIFT). See Swing and Timing and Batting Explained.
While batting the cursor is hidden and confined to the window (in builds on Windows and Linux), so aiming at an edge can’t click another app.
Skipping
The swing button also skips. See Skipping dead time.
- Waits (before the first pitch, after a play, between pitches, end of round): one press skips every wait up to the next pitch.
- Ball flight: jumps to where the ball comes to rest. A home run can be skipped only after 0.5 s of flight.
- Home run total: hurries the score into the score panel.
- Instant replay: ends it (“SPACE / CLICK TO SKIP”). In a big-moment replay one press skips both the close-up and the tracer shot. The press that made the swing can’t skip its own replay. See Hit Show.
- Cutscenes: see Cutscenes.
- Run over screen: Space or a click on the panel fills both bars at once.
Pause
- Esc toggles pause in an at-bat (
Time.timeScale = 0). Losing window focus (alt-tab) also pauses. - The pause menu: RESUME, the settings (MUSIC, SOUND, AIM SPEED, TIMING RING, FPS COUNTER, CUTSCENES, REPLAYS, display options), then SAVE & QUIT TO MENU (when the run can be saved; it resumes from the map checkpoint) and ABANDON RUN (solo) or LEAVE GAME (co-op).
- In the batting cage the pause menu also has PITCH: …, PARK: … and LEAVE CAGE.
- If the dev menu is open, Esc closes it first.
Batting cage
| Key | What it does |
|---|---|
| Tab | Next pitch: Mixed, then each pitch type, then Mixed again. Restarts the session |
| M | Next ballpark (wraps round). Rebuilds the field |
Both are ignored while paused (use the pause menu buttons instead). See Batting Cage.
Menus
- Esc closes an open popup (perks, settings, cage parks) on lobby-style screens.
- Customize screen: arrow keys or WASD pan the camera, the scroll wheel zooms over the stage, Esc goes back to the main menu. See Customization.
Developer keys
F1 (dev menu), Ctrl+Shift+F (Fit Mode on the Customize screen) and Ctrl+Shift+N (network test on the main menu) are developer tools. See Dev Menu and Shortcuts and Fit Mode.
Numbers
| What | Value | Where to tune |
|---|---|---|
| Swing bindings | <Keyboard>/space, <Mouse>/leftButton, <Gamepad>/buttonSouth | SwingInput.EnsureAction |
| Press time rewind | at most one frame | SwingInput.OnSwing |
| Aim clamp | x -0.7 to 0.7 m, y 0.1 to 1.6 m | SwingInput.ReadAim |
| AIM SPEED | 0.5x to 2.5x, steps of 0.05, default 1x | SettingsView.MinAimSensitivity, MaxAimSensitivity; GameSettings.aimSensitivity |
| TIMING RING | off by default | GameSettings.showTimingRing |
| REPLAYS | on by default (big-moment replay only) | GameSettings.noReplays |
| Hit aim keys | A, D, W, S and the arrow keys: all or nothing | SwingInput.ReadHitAim |
| Stick deadzone (hit aim) | 0.3; W/S full effect by 0.8 tilt | SwingInput.StickDeadzone, HitTables.HeightAmount |
| Home run skip delay | 0.5 s | AtBatController.MinHomeRunFlightSeconds |
In the code
| File | What it does |
|---|---|
Assets/_Project/Scripts/Batting/SwingInput.cs | Swing action (Input System), PressTime, ReadAim, ReadHitAim |
Assets/_Project/Scripts/UI/HudView.cs | Key hints and the held-aim box |
Assets/_Project/Scripts/Batting/AtBatController.cs | SkipPressed, SkippableWait, flight skip |
Assets/_Project/Scripts/Batting/InstantReplay.cs | Replay skip |
Assets/_Project/Scripts/UI/UIRoot.cs | Esc pause, focus pause, cursor confine, pause menu |
Assets/_Project/Scripts/Modes/BattingCage.cs | Tab and M |
Assets/_Project/Scripts/UI/SettingsView.cs | AIM SPEED and TIMING RING |
Gotchas
- Swing and skip share one button. A press during dead time skips; a press during the windup (before release) does nothing.
- A gamepad can swing, skip and aim the hit (left stick) but cannot move the aim helper or pause.
- A/D and W/S count only at the moment of contact; before that they just light the held-aim box. A way-early or way-late (foul-timed) swing ignores A/D.
- The README controls line still says “mouse = aim the contact ring” and doesn’t mention A/D or W/S.
- Tab and M use the old
Inputclass, which works because project input handling is set to Both. - The cage HUD hint reads “ESC to leave”, but Esc opens the pause menu; leaving is the LEAVE CAGE button there.
- The README controls line mentions Tab in the cage but not M.
- The Editor’s Game view does not confine the cursor; builds do.
Related
- Swing and Timing: what the swing press does
- Batting Explained: what the held direction does
- At-Bat Loop: when presses count
- Batting Cage: practice mode
- Dev Menu and Shortcuts: developer keys
- UI System: how screens read input