Timeline Causes Crash

I am trying to make a timeline using a curve I made to make the camera move back progressively while sprinting. It worked fine before I linked the timeline code to my sprint function but once I did every time I try to hit play, the engine will crash with this error.

Assertion failed: [File:D:/Build/++UE4/Sync/Engine/Source/Runtime/CoreUObject/Private/UObject/ScriptCore.cpp [Line: 1234] Failed to find function TimelineEnd in BP_PlayerCharacter_C /Game/ThirdPersonCPP/Maps/UEDPIE_0_ThirdPersonExampleMap.ThirdPersonExampleMap:PersistentLevel.BP_PlayerCharacter_5

UE4Editor_Core
UE4Editor_Core
UE4Editor_Core
UE4Editor_Core
UE4Editor_CoreUObject
UE4Editor_Survival_7122!TBaseUFunctionDelegateInstance<ASurvivalCharacter,void __cdecl(void)>::TBaseUFunctionDelegateInstance<ASurvivalCharacter,void __cdecl(void)>() [c:\program files\epic games\ue_4.23\engine\source\runtime\core\public\delegates\delegateinstancesimpl.h:175]
UE4Editor_Survival_7122!ASurvivalCharacter::BeginPlay() [c:\users\jackh\documents\unreal projects\survival\source\survival\survivalcharacter.cpp:116]
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_Engine
UE4Editor_UnrealEd
UE4Editor_UnrealEd
UE4Editor_UnrealEd
UE4Editor_UnrealEd
UE4Editor_UnrealEd
UE4Editor
UE4Editor
UE4Editor
UE4Editor
UE4Editor
kernel32
ntdll

I checked line 116 like it says in the error but I have no clue what the issue could be with that line in particular, here is my .cpp:

ASurvivalCharacter::ASurvivalCharacter() {
	
	// 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 = 300.f;
	GetCharacterMovement()->AirControl = 0.2f;

	// Create a camera boom (pulls in towards the player if there is a collision)
	CameraBoom = CreateDefaultSubobject<USpringArmComponent>(TEXT("CameraBoom"));
	CameraBoom->SetupAttachment(RootComponent);
	CameraBoom->TargetArmLength = 150.f; // The camera follows at this distance behind the character	
	CameraBoom->SocketOffset = (FVector(0, 60, 40)); //towards or away from player, left right of player, up down of player
	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

	// Note: The skeletal mesh and anim blueprint references on the Mesh component (inherited from Character) 
	// are set in the derived blueprint asset named MyCharacter (to avoid direct content references in C++)

	PrimaryActorTick.bCanEverTick = true;

	SprintMult = 2.f;
	sprinting = false;


}

//////////////////////////////////////////////////////////////////////////
// Input

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->BindAction("SwitchCamera", IE_Pressed, this, &ASurvivalCharacter::ChangeCamera);
	PlayerInputComponent->BindAction("Sprint", IE_Pressed, this, &ASurvivalCharacter::Sprint);
	PlayerInputComponent->BindAction("Sprint", IE_Released, this, &ASurvivalCharacter::StopSprint);

	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("TurnRate", this, &ASurvivalCharacter::TurnAtRate);
	PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput);
	PlayerInputComponent->BindAxis("LookUpRate", this, &ASurvivalCharacter::LookUpAtRate);

	// handle touch devices
	PlayerInputComponent->BindTouch(IE_Pressed, this, &ASurvivalCharacter::TouchStarted);
	PlayerInputComponent->BindTouch(IE_Released, this, &ASurvivalCharacter::TouchStopped);

	// VR headset functionality
	PlayerInputComponent->BindAction("ResetVR", IE_Pressed, this, &ASurvivalCharacter::OnResetVR);
}

void ASurvivalCharacter::TimelineProgress(float Value) {
	//CameraBoom->TargetArmLength = FMath::Lerp(StartLength, EndLength, Value);
}

void ASurvivalCharacter::TimelineEnd(float Value) {
	//CameraBoom->TargetArmLength = FMath::Lerp(EndLength, StartLength, Value);
}

void ASurvivalCharacter::OnResetVR() {
	UHeadMountedDisplayFunctionLibrary::ResetOrientationAndPosition();
}

void ASurvivalCharacter::Tick(float DeltaTime) {
	Super::Tick(DeltaTime);

	CurveTimeline.TickTimeline(DeltaTime);
}

void ASurvivalCharacter::BeginPlay() {
	Super::BeginPlay();

	if (CurveFloat) {
		FOnTimelineFloat TimelineProgress;
		FOnTimelineEventStatic TimelineEnd;

		TimelineProgress.BindUFunction(this, FName("TimelineProgress"));
		TimelineEnd.BindUFunction(this, FName("TimelineEnd"));

		CurveTimeline.AddInterpFloat(CurveFloat, TimelineProgress);
		CurveTimeline.SetTimelineFinishedFunc(TimelineEnd);

		StartLength = 125.f;
		EndLength = 175.f;
	}
}

void ASurvivalCharacter::Sprint() {
	GetCharacterMovement()->MaxWalkSpeed *= SprintMult;
	CurveTimeline.PlayFromStart();
}

void ASurvivalCharacter::StopSprint() {
	GetCharacterMovement()->MaxWalkSpeed /= SprintMult;
	CurveTimeline.Stop();

Line 116 is this one:

TimelineProgress.BindUFunction(this, FName("TimelineProgress"));

Thanks in advanced for any help that I receive!

I was able to fix it myself. I’m not sure how I did, but here is what I changed: I moved my CurveFloat variable from the protected section in the header to the public. I added UFUNCTION() above both of my timeline functions in the header. I moved the if(CurveFloat) {…} to my sprint and stopsprint function instead of my begin play function. And I moved the initialization of my length variables from the begin play to the constructor.