Engine Crashing When Using SetTimer

Having some strange issues I can’t track down, where the engine immediately crashes upon trying to bind my hunger system’s hunger removal method. I want it to remove 1 hunger every 10 seconds, but something about the way I’m binding the functions to the timer is making the whole engine crash. Would love some insight, I lack experience and have been trying to learn by working on these small systems. All code is below. Thanks!

// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "SurvivalCharacter.generated.h"

UCLASS(config=Game)
class ASurvivalCharacter : public ACharacter
{
	GENERATED_BODY()

	/** Camera boom positioning the camera behind the character */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
	class USpringArmComponent* CameraBoom;

	/** Follow camera */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
	class UCameraComponent* FollowCamera;

public:
	ASurvivalCharacter();

	/** Base turn rate, in deg/sec. Other scaling may affect final turn rate. */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera)
	float BaseTurnRate;

	/** Base look up/down rate, in deg/sec. Other scaling may affect final rate. */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category=Camera)
	float BaseLookUpRate;

	/** The amount of hunger the player currently has. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Stats")
	float CurrentHunger;

	/** The amount of hunger to remove on each removal call. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Stats")
	float HungerRemovalAmount;

	/** The time period to wait before more hunger is removed */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Stats")
	float HungerRemovalTime;

	UPROPERTY(BlueprintReadOnly, Category="Stats")
	bool IsHungerZero = false;

protected:

	FTimerHandle HungerTimerHandle;

	/** Initialize and bind controls.*/
	void SetupControls();

	/** Initialize and configure camera. */
	void SetupCamera();

	/** Called for forwards/backward input. */
	void MoveForward(float Value);

	/** Called for side to side input. */
	void MoveRight(float Value);

	/** Initialize and setup hunger system. */
	UFUNCTION()
	void SetupHunger();
	
	/** Remove Hunger at the HungerRate. */
	void RemoveHunger();

	// APawn interface
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
	// End of APawn interface

public:
	/** Returns CameraBoom subobject **/
	FORCEINLINE class USpringArmComponent* GetCameraBoom() const { return CameraBoom; }
	/** Returns FollowCamera subobject **/
	FORCEINLINE class UCameraComponent* GetFollowCamera() const { return FollowCamera; }

	virtual void BeginPlay() override;;

	virtual void Tick(float DeltaSeconds) override;
};

// Copyright Epic Games, Inc. All Rights Reserved.

#include "SurvivalCharacter.h"

#include <string>

#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"
#include "Components/InputComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "GameFramework/Controller.h"
#include "GameFramework/SpringArmComponent.h"

ASurvivalCharacter::ASurvivalCharacter()
{
	SetActorTickEnabled(true);
	PrimaryActorTick.bCanEverTick = true;
}

void ASurvivalCharacter::BeginPlay()
{
	SetupControls();
	SetupCamera();
	SetupHunger();
}

void ASurvivalCharacter::Tick(float DeltaSeconds)
{
	//Print out CurrentHunger.
	if (GEngine)
		GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Blue, FString::FromInt(CurrentHunger));
}

void ASurvivalCharacter::SetupCamera()
{
	// Create a camera boom (pulls in towards the player if there is a collision)
	CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
	CameraBoom->SetupAttachment(RootComponent);
	CameraBoom->TargetArmLength = 300.0f; // The camera follows at this distance behind the character	
	CameraBoom->bUsePawnControlRotation = true; // Rotate the arm based on the controller

	// Create a follow camera
	FollowCamera = CreateDefaultSubobject<UCameraComponent>(TEXT("FollowCamera"));
	FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); // Attach the camera to the end of the boom and let the boom adjust to match the controller orientation
	FollowCamera->bUsePawnControlRotation = false; // Camera does not rotate relative to arm
}

void ASurvivalCharacter::SetupControls()
{
	// Set size for collision capsule
	GetCapsuleComponent()->InitCapsuleSize(42.f, 96.0f);
	
	// set our turn rates for input
	BaseTurnRate = 45.f;
	BaseLookUpRate = 45.f;

	// Don't rotate when the controller rotates. Let that just affect the camera.
	bUseControllerRotationPitch = false;
	bUseControllerRotationYaw = false;
	bUseControllerRotationRoll = false;

	// Configure character movement
	GetCharacterMovement()->bOrientRotationToMovement = true; // Character moves in the direction of input...	
	GetCharacterMovement()->RotationRate = FRotator(0.0f, 540.0f, 0.0f); // ...at this rotation rate
	GetCharacterMovement()->JumpZVelocity = 600.f;
	GetCharacterMovement()->AirControl = 0.4f;
}

void ASurvivalCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{
	// Set up gameplay key bindings
	check(PlayerInputComponent);
	PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
	PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);

	PlayerInputComponent->BindAxis("MoveForward", this, &ASurvivalCharacter::MoveForward);
	PlayerInputComponent->BindAxis("MoveRight", this, &ASurvivalCharacter::MoveRight);

	// We have 2 versions of the rotation bindings to handle different kinds of devices differently
	// "turn" handles devices that provide an absolute delta, such as a mouse.
	// "turnrate" is for devices that we choose to treat as a rate of change, such as an analog joystick
	PlayerInputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput);
	PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput);
}

void ASurvivalCharacter::MoveForward(float Value)
{
	if (Controller != nullptr && Value != 0.0f)
	{
		// find out which way is forward
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0, Rotation.Yaw, 0);

		// get forward vector
		const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
		AddMovementInput(Direction, Value);
	}
}

void ASurvivalCharacter::MoveRight(float Value)
{
	if (Controller != nullptr && Value != 0.0f)
	{
		// find out which way is right
		const FRotator Rotation = Controller->GetControlRotation();
		const FRotator YawRotation(0, Rotation.Yaw, 0);
	
		// get right vector 
		const FVector Direction = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
		// add movement in that direction
		AddMovementInput(Direction, Value);
	}
}

void ASurvivalCharacter::SetupHunger()
{
	CurrentHunger = 100.0f;
	HungerRemovalAmount = 1.0f;
	HungerRemovalTime = 10.0f;
	GetWorldTimerManager().SetTimer(HungerTimerHandle, this, &ASurvivalCharacter::RemoveHunger, HungerRemovalTime, !IsHungerZero);
}

void ASurvivalCharacter::RemoveHunger()
{
	CurrentHunger -= HungerRemovalAmount;
	CurrentHunger = FMath::Clamp(CurrentHunger, 0.0f, 100.0f);

	if (CurrentHunger <= 0)
		IsHungerZero = true;
	else
		IsHungerZero = false;
}