Quick answer: Enable Orient Rotation to Movement on the Character Movement component, turn off Use Controller Rotation Yaw on the character, and give it a non-zero Rotation Rate yaw. For the camera, set the Spring Arm to use pawn control rotation. AI characters that slide without turning need Use Acceleration for Paths.

This is one of the first problems people hit when building a third-person character from scratch rather than from the template. The character strafes like a crab, moonwalks backwards, or turns with the mouse instead of the direction it walks. Three settings decide it.

The three settings that decide facing

  1. Character Movement > Orient Rotation to Movement: on. The movement component turns the character toward its acceleration direction.
  2. Character (class defaults) > Pawn > Use Controller Rotation Yaw: off. When on, the character's yaw is copied from the controller (your mouse or right stick) every frame, which overrides orient-to-movement and makes the character face the camera.
  3. Character Movement > Rotation Rate: a non-zero yaw, such as 500 to 720 degrees per second. With zero, orient-to-movement is enabled but never turns the character.
// AMyCharacter constructor
bUseControllerRotationYaw = false;
GetCharacterMovement()->bOrientRotationToMovement = true;
GetCharacterMovement()->RotationRate = FRotator(0.f, 540.f, 0.f);

Make the camera orbit independently

With the character no longer following the controller, the camera has to. On the Spring Arm, enable Use Pawn Control Rotation; on the Camera attached to it, leave it off. The controller now rotates the camera rig while the body turns toward movement.

Your movement input must also be relative to the camera, not the character, or forward will mean “wherever the character currently faces” and it will spiral:

const FRotator YawRotation(0.f, Controller->GetControlRotation().Yaw, 0.f);
const FVector Forward = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
const FVector Right   = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
AddMovementInput(Forward, MoveValue.Y);
AddMovementInput(Right, MoveValue.X);

Conflicting setting: Use Controller Desired Rotation

Character Movement also has Use Controller Desired Rotation, which smoothly turns the character toward the controller's rotation. If Orient Rotation to Movement is on, it takes priority. Strafing setups (aiming, lock-on) switch between the two at runtime: turn orient-to-movement off and desired rotation on while aiming, and back again afterwards.

AI characters slide without turning

Orient-to-movement turns toward acceleration. By default, path following on AI characters requests velocity directly, so acceleration can be zero and the character slides along the path facing one way. Enable Use Acceleration for Paths in the Character Movement component's Nav Movement settings, or enable Use Controller Desired Rotation on AI characters and let the AI controller set focus.

Other things that override rotation

Movement bugs from players

Movement and camera bugs rarely crash, so they only reach you if players report them. Bugnet's Unreal SDK gives your UMG pause menu a ReportBug() call that files the report with a screenshot, the level and the player's hardware attached.

Frequently asked questions

How do I make an Unreal character face the direction it moves?

Enable Orient Rotation to Movement on the Character Movement component, disable Use Controller Rotation Yaw on the character, and set a non-zero Rotation Rate yaw.

Why does my Unreal character always face the camera?

Use Controller Rotation Yaw is enabled on the character, so its yaw follows the controller. Turn it off and use Orient Rotation to Movement instead.

Why do AI characters slide without turning in Unreal?

Orient Rotation to Movement uses acceleration, and AI path following can move without it. Enable Use Acceleration for Paths, or use controller desired rotation with AI focus.

Orient to movement on, controller yaw off, rotation rate above zero. In that order.