Error with ue4 c++ fps tutorial, what should I do?

I am up to section 3.2 of the fps tutorial on unreal engine 4. In this section I’m supposed to implement shooting into the code via the fire function so that i can shoot projectiles in-game. However, after typing the code the tutorial provided, I got one error when compiling it. The error is as follows

/Users/apple/Documents/Unreal Projects/FPSProject/Source/FPSProject/FPSCharacter.cpp:120:38: ‘Instigator’ is a private member of ‘AActor’

When I remove this line and compile the code it does so successfully, but when I test it out on unreal, I can’t shoot projectiles at all.

Here is the code

FPSCharacter.cpp

#include “FPSCharacter.h”
#include “FPSProject.h”
#include “FPSCharacter.generated.h”
#include “FPSProjectile.h”
#include “GameFramework/Actor.h”

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

// Create a first person camera component.
FPSCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
// Attach the camera component to our capsule component.
FPSCameraComponent->SetupAttachment(GetCapsuleComponent());
// Position the camera slightly above the eyes.
FPSCameraComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 50.0f + BaseEyeHeight));
// Allow the pawn to control camera rotation.
FPSCameraComponent->bUsePawnControlRotation = true;

// Create a first person mesh component for the owning player.
FPSMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("FirstPersonMesh"));
// Only the owning player sees this mesh.
FPSMesh->SetOnlyOwnerSee(true);
// Attach the FPS mesh to the FPS camera.
FPSMesh->SetupAttachment(FPSCameraComponent);
// Disable some environmental shadowing to preserve the illusion of having a single mesh.
FPSMesh->bCastDynamicShadow = false;
FPSMesh->CastShadow = false;

// The owning player doesn't see the regular (third-person) body mesh.
GetMesh()->SetOwnerNoSee(true);

}

// Called when the game starts or when spawned
void AFPSCharacter::BeginPlay()
{
Super::BeginPlay();

if (GEngine)
{
    // Put up a debug message for five seconds. The -1 "Key" value (first argument) indicates that we will never need to update or refresh this message.
    GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("We are using FPSCharacter."));
}

}

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

}

// Called to bind functionality to input
void AFPSCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);

// Set up "movement" bindings.
PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward);
PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);

// Set up "look" bindings.
PlayerInputComponent->BindAxis("Turn", this, &AFPSCharacter::AddControllerYawInput);
PlayerInputComponent->BindAxis("LookUp", this, &AFPSCharacter::AddControllerPitchInput);

// Set up "action" bindings.
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &AFPSCharacter::StartJump);
PlayerInputComponent->BindAction("Jump", IE_Released, this, &AFPSCharacter::StopJump);
PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &AFPSCharacter::Fire);

}

void AFPSCharacter::MoveForward(float Value)
{
// Find out which way is “forward” and record that the player wants to move that way.
FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::X);
AddMovementInput(Direction, Value);
}

void AFPSCharacter::MoveRight(float Value)
{
// Find out which way is “right” and record that the player wants to move that way.
FVector Direction = FRotationMatrix(Controller->GetControlRotation()).GetScaledAxis(EAxis::Y);
AddMovementInput(Direction, Value);
}

void AFPSCharacter::StartJump()
{
bPressedJump = true;
}

void AFPSCharacter::StopJump()
{
bPressedJump = false;
}

void AFPSCharacter::Fire()
{
// Attempt to fire a projectile.
if (ProjectileClass)
{
// Get the camera transform.
FVector CameraLocation;
FRotator CameraRotation;
GetActorEyesViewPoint(CameraLocation, CameraRotation);

    // Transform MuzzleOffset from camera space to world space.
    FVector MuzzleLocation = CameraLocation + FTransform(CameraRotation).TransformVector(MuzzleOffset);
    FRotator MuzzleRotation = CameraRotation;
    // Skew the aim to be slightly upwards.
    MuzzleRotation.Pitch += 10.0f;
    UWorld* World = GetWorld();
    if (World)
    {
        FActorSpawnParameters SpawnParams;
        SpawnParams.Owner = this;
        SpawnParams.Instigator = Instigator;
        // Spawn the projectile at the muzzle.
        AFPSProjectile* Projectile = World->SpawnActor<AFPSProjectile>(ProjectileClass, MuzzleLocation, MuzzleRotation, SpawnParams);
        if (Projectile)
        {
            // Set the projectile's initial trajectory.
            FVector LaunchDirection = MuzzleRotation.Vector();
            Projectile->FireInDirection(LaunchDirection);
        }
    }
}

}

Hey, I know this post is kind of old and you’ve probably already found out the solution but I just ran into this same issue and I found no solutions on the internet and I’m pretty sure that its just a typo in the tutorial so I thought it would be good to post the answer anyway so that the next person who runs into this issue has an answer.

Here is the block in question with the fix. It is in the FPSCharacter.cpp file within the Fire() function.

if(World)
{     
            FActorSpawnParameters SpawnParams;
            SpawnParams.Owner = this;
            SpawnParams.Instigator = this;
}

So FActorSpawnParameters is a struct with a variable ‘Owner’ and ‘Instigator’ both of which we want to set to the APawn that is spawning the projectile.

The tutorial instructs you to set SpawnParams.Instigator = Instigator which is most definitely a typo because so far as I can tell the APawn class does not have an Instigator variable for us to access.

Hope this helps!!