fps-controller

Implements a first-person character controller in GDScript with coyote time, jump buffering, and air control.

66|4|Updated Feb 26, 2026
One-click install
npx skills add https://github.com/SummerEngine/summer --skill fps-controller-summerengine
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: fps-controller
Source: https://github.com/SummerEngine/summer/tree/main/library/skills/fps-controller
Command: npx skills add https://github.com/SummerEngine/summer --skill fps-controller-summerengine

SYSTEM DOCUMENTATION & REQUIREMENTS

What problem does it solve? Building a first-person controller that feels right requires handling subtle movement details — coyote time, jump buffering, asymmetric gravity, and external forces like knockback — that naive implementations get wrong, producing stiff or unfair-feeling movement. ## Core Features & Use Cases - Complete movement model: WASD movement, mouse look with yaw/pitch split, sprint, jump, separate ground/air acceleration and friction, and asymmetric gravity. - Game-feel timers: Coyote time and jump buffering windows so jumps near ledges and just-before-landing presses register correctly. - External velocity accumulator: A public add_external_velocity API for knockback, explosions, jump pads, and conveyor belts that decays smoothly without fighting player input. - Use Case: Scaffold a playable FPS prototype in Summer Engine by adding a CharacterBody3D player with capsule collision, head-mounted camera, InputMap bindings, and the controller script via MCP tools. ## Quick Start Ask your agent to add a first-person player controller with WASD movement, mouse look, and jumping to the current scene using the fps-controller skill.

Frequently Asked Questions about fps-controller

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I add a first-person controller to a Godot scene?

Add a CharacterBody3D with a CapsuleShape3D collision, a Head Node3D holding the Camera3D, bind WASD/jump/sprint InputMap actions, and attach a GDScript controller handling movement in _physics_process. This skill walks through each step via MCP tools.

What is coyote time and jump buffering in platformers and FPS games?

Coyote time is a short grace window (~0.1s) after walking off a ledge where jumping still works; jump buffering queues a jump pressed just before landing. Both fix the 'unfair death' and 'eaten input' complaints players report.

How much air control should an FPS controller have?

The shipping FPS standard is roughly 25-30% of ground acceleration. Zero air control feels like ice, while full air control makes momentum meaningless. Tune the air_accel export to adjust without changing code.

Why does knockback keep accumulating on my character controller?

External velocity compounds when the previous frame's contribution is not subtracted before applying new physics. Subtract the last applied external velocity at the start of _physics_process, then apply and decay the new impulse.

Does this controller support multiplayer networking?

Yes, the skeleton supports server-authoritative patterns by gating physics per peer and syncing position and velocity. The external-velocity accumulator lets the host RPC knockback impulses to clients without fighting local input.

Why does my FPS camera tilt or roll when looking around?

Camera tilt happens when pitch is applied to the body instead of a separate head node. Apply yaw only on the Player root and pitch only on the Head node, clamped to roughly ±80 degrees, and never combine rotations on one node.