| name | godot-genre-shooter-fps |
| description | Expert blueprint for First-Person Shooters: fps_camera_look, fps_movement_logic, hitscan_weapon_query, weapon_bobbing_system, procedural recoil, and FPS NEVER rules. Shared TPS/cover theory links to godot-genre-shooter. Keywords: FPS, movement physics, weapon bobbing, camera sway, hitscan, viewmodel, air control. |
MANDATORY script reads (start here)
- fps_camera_look.gd โ raw
_input mouse look (yaw/pitch)
- fps_movement_logic.gd โ accel/friction/air control
- hitscan_weapon_query.gd โ space-state hitscan
- weapon_bobbing_system.gd โ viewmodel bob/sway
Also: procedural_recoil_handler.gd, hitscan_weapon_logic.gd, advanced_fps_controller.gd, weapon_state_machine.gd, frame_perfect_input.gd, bullet_decal_spawner.gd, weapon_spread_calc.gd, server_projectile_instance.gd, player_anim_bridge.gd, recoil_system.gd (pattern + bloom), aim_assist.gd (controller friction/magnetism).
advanced_weapon_controller.gd is shared theory โ keep FPS feel in the scripts above; genre routing for TPS โ sibling skill.
Core Loop
Move/Look โ Aim โ Fire (hitscan) โ Recoil recover โ Acquire
NEVER Do (FPS)
Gunplay & registration
- NEVER hit-detect in
_process โ use _physics_process + intersect_ray.
- NEVER apply recoil only to the gun mesh โ kick camera + bloom/spread.
- NEVER trust client damage โ server authority + lag compensation.
- NEVER forget
exclude / add_exception for the player RID.
- NEVER use
== on float cooldowns โ is_equal_approx.
Input & movement
- NEVER poll mouse in
_physics_process โ _input / _unhandled_input for look.
- NEVER accumulate look on a raw
Transform3D โ store yaw/pitch floats.
- NEVER multiply velocity by
delta before move_and_slide().
- NEVER use
Transform3D.looking_at for muzzle forward โ use -transform.basis.z.
Polish
- NEVER single
AudioStreamPlayer for gunfire โ layer mechanical + shot + tail.
- NEVER leave decals forever โ fade/pool (bullet_decal_spawner.gd).
- NEVER hardcode weapon stats โ WeaponData Resources.
- NEVER use plain Strings for hot weapon states โ
StringName.
Advanced FPS (keep)
Viewmodel sway / bob
Procedural sine bob + look sway โ weapon_bobbing_system.gd.
Step-up
Ray forward/down from step_height when is_on_wall() after move_and_slide(); lift to step top for stairs.
Tactical lean
Roll camera Z + local X offset from Input.get_axis("lean_left","lean_right") with lerp.
Shared weapon theory
Hitscan vs projectile, spray patterns, and net prediction details that are not FPS-rig specific โ godot-genre-shooter + combat/multiplayer complements. Implement FPS fire path via hitscan_weapon_query.gd + procedural_recoil_handler.gd + recoil_system.gd.
MANDATORY for hitscan/projectile tradeoffs, three-layer recoil, aim assist, weapon balance matrices, and client prediction: fps-weapon-theory.md. Do NOT Load after MANDATORY script reads unless extending beyond bob/step/lean.
Reference
Progressive disclosure: open Official Documentation links only when researching a specific API; load Related Skills when routing to a peer domain โ do not preload the whole lattice.
Official Documentation
- Ray-casting โ PhysicsDirectSpaceState3D
intersect_ray patterns for hitscan registration without Area3D ballistics.
- Physics introduction โ collision layers/masks, layers for player exclude, and physics tick vs visual frame for gunplay.
- Using 3D transforms โ basis axes and
-transform.basis.z forward vectors for aim, recoil, and muzzle direction.
- Using InputEvent โ
_input vs _physics_process so mouse look stays zero-latency while movement stays physics-synced.
- Mouse and input coordinates โ relative mouse motion, capture, and screen-center projection for aim rays.
- Controllers, gamepads, and joysticks โ analog look axes and deadzones that aim-assist friction/magnetism build on.
- Using decals โ Decal node projection for bullet impacts instead of Sprite3D/QuadMesh stickers.
- High-level multiplayer โ RPC authority and fire-event patterns for server-validated hitscan without syncing every bullet.
- Using AnimationTree โ blend/state machines for idle/aim/fire/reload without
! in expressions.
- Resources โ WeaponData Resource stats (damage, recoil, spread) instead of hardcoded class constants.
- Audio streams โ layered mechanical/shot/tail streams for gunfire weight.
- Optimization using Servers โ RenderingServer RID paths for high-volume visual projectiles without SceneTree spam.
Related Skills
Prerequisites
- godot-project-foundations โ scene tree, InputMap actions, and Resource import basics before FPS controllers and WeaponData wiring.
- godot-input-handling โ mouse capture, action buffering, and look vs move split that frame-perfect fire and camera look depend on.
- godot-raycasting-queries โ physics-synced ray/shape queries and exclude RIDs that hitscan registration builds on.
Complements
Downstream / consumers
- godot-monte-carlo-balancer โ simulate weapon asymmetry matrices, TTK bands, and bloom/recoil knobs before shipping balance tables.
- godot-genre-battle-royale โ large-scale relevancy and lag-compensated combat that reuses FPS hitscan/recoil feel inside BR matches.
Master
- godot-master โ library router and mirrored module entry; open when discovering which Domain Skill owns a cross-cutting FPS concern.