Having trouble using a timeline in a UObject

Hi! I’ve been trying to create a small UObject to act as a template class for actions my actors can perform. Some of them are movement-based, so I have tried to add a timeline. Even though I have bound functions to its update and end, it doesn’t seem to work at all. None of its log messages appear, only those of the UObject’s tick.

At this point, I’m just messing around, trying different solutions, but I haven’t found an answer yet to this one. Is there a way for me to somehow bind the timeline’s tick to the UObject’s, or something of the sort?

CPP_ObjectAction.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Components/TimelineComponent.h"
#include "CPP_ObjectAction.generated.h"

/**
*
*/
UCLASS(BlueprintType, Blueprintable)
class TRPG_GAME_API UCPP_ObjectAction : public UObject, public FTickableGameObject
{
GENERATED_BODY()
public:
virtual void Tick(float DeltaTime) override;
virtual TStatId GetStatId() const override;
virtual ETickableTickType GetTickableTickType() const override;
virtual bool IsTickable() const override;
virtual bool IsTickableWhenPaused() const override;
virtual bool IsTickableInEditor() const override;
UFUNCTION(BlueprintCallable, Category = "Action")
void Initialize();
UFUNCTION(BlueprintCallable, Category = "Action")
virtual void StartAction();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Timeline")
class UTimelineComponent* Timeline;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Timeline")
class UCurveFloat\* FloatCurve;
protected:
UFUNCTION(BlueprintCallable, Category = "Action")
virtual void EndAction();
FOnTimelineEvent TimelineEnded;
UFUNCTION()
void TimelineEnd();
FOnTimelineEvent TimelineUpdated;
UFUNCTION()
void TimelineUpdate();

private:
FOnTimelineFloat TimelineFloat;
UCPP_ObjectAction();
uint32 LastFrame = INDEX_NONE;
bool CanTick;
};

CPP_ObjectAction.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "CPP_ObjectAction.h"
#include "CPP_GridObject.h"
#include "Curves/CurveFloat.h"

UCPP_ObjectAction::UCPP_ObjectAction()
{
	CanTick = false;
	Timeline = CreateDefaultSubobject<UTimelineComponent>(TEXT("TimelineComponent"));
	if (Timeline && FloatCurve)
	{
		Timeline->AddInterpFloat(FloatCurve, TimelineFloat, TEXT("Alpha"), TEXT("Alpha"));
		Timeline->SetPlayRate(1.0f);
		TimelineEnded.BindUFunction(this, FName("TimelineEnd"));
		Timeline->SetTimelineFinishedFunc(TimelineEnded);
		TimelineUpdated.BindUFunction(this, FName("TimelineUpdate"));
		Timeline->SetTimelinePostUpdateFunc(TimelineUpdated);
		Timeline->PrimaryComponentTick.bCanEverTick = true;
		Timeline->SetComponentTickEnabled(true);
		Timeline->RegisterComponent();
	}
	return;
	//Initialize();
}

void UCPP_ObjectAction::Tick(float DeltaTime)
{
	if (LastFrame == GFrameCounter) return;
	UE_LOG(LogTemp, Warning, TEXT("OBJECT TICK!"));
        // This does show up, it shows the UObject's ticks do indeed work.
	LastFrame = GFrameCounter;
}

TStatId UCPP_ObjectAction::GetStatId() const
{
	RETURN_QUICK_DECLARE_CYCLE_STAT(UCPP_ObjectAction, STATGROUP_Tickables);
}

ETickableTickType UCPP_ObjectAction::GetTickableTickType() const
{
	return ETickableTickType();
}

bool UCPP_ObjectAction::IsTickable() const
{
	return CanTick;
}

bool UCPP_ObjectAction::IsTickableWhenPaused() const
{
	return false;
}

bool UCPP_ObjectAction::IsTickableInEditor() const
{
	return false;
}

void UCPP_ObjectAction::Initialize()
{
}

void UCPP_ObjectAction::StartAction()
{
	UE_LOG(LogTemp, Warning, TEXT("We're starting!"));
        // This does show up, it marks the start of the ticks.
	CanTick = true;
	Timeline->PlayFromStart();
	return;
}

void UCPP_ObjectAction::EndAction()
{
	return;
}

void UCPP_ObjectAction::TimelineEnd()
{
	CanTick = false;
	UE_LOG(LogTemp, Warning, TEXT("This happened right at the end!"));
        // This doesn't show up, the end of the timeline is busted.
}

void UCPP_ObjectAction::TimelineUpdate()
{
	UE_LOG(LogTemp, Warning, TEXT("This happens every tick, yes?"));
        // This doesn't show up, the update of the timeline is busted.
}