2. Configure Input to Control the Camera

  1. We need to decide what our camera controls will do, and then set up inputs accordingly. For this project, let's allow our follow distance to shorten and field of view to zoom in when the right mouse button is held down. Let's also control our viewing angle with the mouse, and our Pawn's movement with the WASD keys. To do this, we'll open the Project Settings from the Edit dropdown menu in the Unreal Engine editor.


  2. We will need to define one Action Mapping and four Axis Mappings as follows:

    Action Mapping
    ZoomIn Right Mouse Button
    Axis Mapping
    MoveForward W 1.0
    S -1.0
    MoveRight A -1.0
    D 1.0
    CameraPitch MouseY 1.0
    CameraYaw MouseX 1.0


    If you would like to understand more about how input mappings work, you may want to consult the Player Input and Pawns tutorial.

Now that we have defined our input, we need to write some code to react to it. We'll head back to Visual Studio to do that next.

Work-In-Progress Code


// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "GameFramework/Pawn.h"
#include "PawnWithCamera.generated.h"

class HOWTO_PLAYERCAMERA_API APawnWithCamera : public APawn

    // Sets default values for this pawn's properties

    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

    // Called every frame
    virtual void Tick( float DeltaSeconds ) override;

    // Called to bind functionality to input
    virtual void SetupPlayerInputComponent(class UInputComponent* InputComponent) override;

    USpringArmComponent* OurCameraSpringArm;
    UCameraComponent* OurCamera;


// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.

#include "HowTo_PlayerCamera.h"
#include "PawnWithCamera.h"

// Sets default values
    // Set this pawn to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
    PrimaryActorTick.bCanEverTick = true;

    //Create our components
    RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("RootComponent"));
    OurCameraSpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraSpringArm"));
    OurCameraSpringArm->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, 50.0f), FRotator(-60.0f, 0.0f, 0.0f));
    OurCameraSpringArm->TargetArmLength = 400.f
    OurCameraSpringArm->bEnableCameraLag = true;
    OurCameraSprintArm->CameraLagSpeed = 3.0f
    OurCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("GameCamera"));
    OurCamera->SetupAttachment(OurCameraSpringArm, USpringArmComponent::SocketName);

    //Take control of the default Player
    AutoPossessPlayer = EAutoReceiveInput::Player0;

// Called when the game starts or when spawned
void APawnWithCamera::BeginPlay()


// Called every frame
void APawnWithCamera::Tick( float DeltaTime )
    Super::Tick( DeltaTime );


// Called to bind functionality to input
void APawnWithCamera::SetupPlayerInputComponent(class UInputComponent* InputComponent)