With your project, version control, and art pipeline in place, the next step is the player controller and movement. How the player moves and feels will define your FPS. This lesson gets you to a responsive first-person character: walk, sprint, jump, crouch, and a basic first-person camera so you can run around a level and feel the game.
You will finish with a character that responds to input, respects physics and collision, and is ready for weapons and combat in the next lessons.
Why movement comes first
Movement is the one system the player touches every second. If it feels floaty, sluggish, or inconsistent, nothing else will save the experience. Getting it right early means:
- You can test level blockouts and encounter spaces by actually playing.
- You have a stable base for adding weapons, abilities, and camera effects later.
- You avoid reworking half the project when you finally fix the controller.
We will use Unreal Engine 5's Character class (or a child of it) so you get capsule collision, built-in movement component, and a standard foundation. You can use Blueprint for speed or C++ if you prefer; the concepts are the same.
Step 1: Create a character and first-person camera
-
Create a Blueprint (or C++ class) based on
Character- In the Content Browser: Right-click, Blueprint Class, pick Character. Name it something like
BP_FPSCharacter. - This gives you a capsule, a
CharacterMovementComponent, and default movement behavior.
- In the Content Browser: Right-click, Blueprint Class, pick Character. Name it something like
-
Add a first-person camera
- Open your character Blueprint.
- Add a Spring Arm (optional; helps with smooth follow and collision) and a Camera as a child of the capsule or a "CameraBoom" socket.
- For a classic FPS, attach the camera to the capsule (or to a short spring arm attached to the capsule) so it moves with the character and does not swing behind.
- Position the camera at roughly eye height (e.g. 64–90 units above the capsule base, depending on your scale).
- Set the camera to use Possess when the player spawns (default if this Blueprint is your Pawn class).
-
Set this Blueprint as the default Pawn
- In your Game Mode (or in Project Settings > Maps & Modes), set the Default Pawn Class to your
BP_FPSCharacterso pressing Play uses it.
- In your Game Mode (or in Project Settings > Maps & Modes), set the Default Pawn Class to your
Pro tip: Keep the camera and movement logic in the same Blueprint (or in the same C++ class) so you have one place to tune feel. Add separate components later for weapons and abilities.
Step 2: Map input to movement
-
Use the Enhanced Input system (recommended in UE5)
- In Project Settings > Input: add an Input Action for Move (e.g. 2D vector for WASD), Jump, Sprint, and Crouch.
- Create an Input Mapping Context and assign keys: W/A/S/D (or stick) to Move, Space to Jump, Left Shift to Sprint, C to Crouch (or your preference).
-
In your character Blueprint or C++
- Move: Read the 2D move input and call
AddMovementInput(GetActorForwardVector(), ForwardValue)andAddMovementInput(GetActorRightVector(), RightValue). Use the movement component's built-in logic; no need to set velocity by hand for basic walking. - Jump: Call
Jump()on the Character (or the movement component). The Character class handles the rest. - Sprint: Set a flag or update
MaxWalkSpeedon theCharacterMovementComponent. For example: when Sprint is pressed, setGetCharacterMovement()->MaxWalkSpeed = 800.f; when released, set it back to 400.f (or your normal speed). - Crouch: Call
Crouch()andUnCrouch()on the Character. The movement component will handle capsule resizing and crouch speed if configured.
- Move: Read the 2D move input and call
-
Mouse look (pitch and yaw)
- Yaw: Add the horizontal input to the character's Yaw (turn the whole character).
- Pitch: Add the vertical input to the camera's local pitch (look up/down). Clamp pitch between about -89 and +89 so the player cannot flip the camera.
- Do this in the Blueprint Tick or in an Input Action handler; avoid doing it in both or you will double-apply.
Common mistake: Applying movement in Tick and also in input events can cause double input or jitter. Prefer applying movement and look in the input handlers and use Tick only for things like smoothing if needed.
Step 3: Tune the movement component
On your Character's Character Movement component, adjust:
- Max Walk Speed – e.g. 400–600 for normal, 700–900 for sprint.
- Max Accel – higher values snap to target speed faster (more arcade); lower values feel heavier.
- Braking Deceleration – how quickly the character stops when input is released.
- Jump Z Velocity – height of jump; tune with gravity.
- Air Control – how much the player can steer while in the air.
- Crouched Half Height – set in the movement component or via Crouch; match your capsule and camera so the view drops when crouching.
Play-test on a simple blockout level and iterate until walk, sprint, jump, and crouch feel right. Small changes to Max Walk Speed and Braking have a big impact on feel.
Step 4: Collision and slope handling
- Your Character's capsule is the collision shape. Keep it so the player does not get stuck in doors or stairs.
- Walkable floor angle (on the movement component) defines what counts as ground. Adjust if the player slides off slopes you want to be walkable.
- Use Step Height (or equivalent) so the character automatically steps up small curbs and stairs without jumping.
If the player gets stuck on geometry, check capsule radius/height and step height; often a slight increase in step height or a smaller capsule radius fixes it.
Step 5: Mini challenge – movement checklist
Before moving on, verify:
- [ ] Walk forward/back/strafe in all directions.
- [ ] Sprint increases speed and stops when you release the key.
- [ ] Jump works and you land on floors and slopes.
- [ ] Crouch lowers the camera and reduces height; uncrouch restores.
- [ ] Mouse look rotates the character (yaw) and the camera (pitch) with no jitter.
- [ ] You can move around a simple blockout level without getting stuck on stairs or small obstacles.
If any of these fail, revisit the input bindings and the movement component settings; the fix is usually there.
Troubleshooting
Character does not move: Ensure the default Pawn is set to your Blueprint and that you are calling AddMovementInput with non-zero values when keys are pressed. Check that the movement component is not disabled.
Camera does not look up/down: Make sure you are applying pitch to the camera (or camera boom), not only to the character root. The character should only rotate in yaw for first-person.
Sprint or crouch does not work: Verify the input actions are bound and that you are setting MaxWalkSpeed (sprint) and calling Crouch()/UnCrouch() (crouch). Check the movement component's crouch and sprint settings.
Jitter or double input: Do not add movement or look in both Tick and input events. Prefer input-only for raw values and use Tick only for optional smoothing.
What is next
With movement in place, you can run through levels and feel the game. In Lesson 6: Weapon Systems & Combat Mechanics you will add a weapon, firing, and basic hit detection so the controller has something to do in the world.
For more on Unreal input and character movement, see the Unreal Engine 5 Documentation and our Unreal Engine Guide on the site.
Found this useful? Bookmark the course and share your movement demo with the community. When you are ready, head to Lesson 6 to add weapons and combat.