Quick answer: In the constructor, set PrimaryComponentTick.bCanEverTick = true;. For runtime-added components, call SetComponentTickEnabled(true) after attachment.

A custom UActorComponent overrides TickComponent to update its state each frame. The TickComponent body never runs. The component is attached, BeginPlay fires, but Tick is silent.

The Default

UActorComponent doesn’t tick by default. The runtime checks PrimaryComponentTick.bCanEverTick at registration time; if false, no tick function is created. Subsequent calls to SetComponentTickEnabled don’t resurrect a missing tick function.

The Fix in C++

UMyComponent::UMyComponent()
{
    PrimaryComponentTick.bCanEverTick = true;
    PrimaryComponentTick.bStartWithTickEnabled = true;
}

void UMyComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
    Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
    // your update logic
}

bCanEverTick must be set in the constructor — setting it later has no effect because the tick function is created during component registration which happens after construction.

Runtime-Added Components

If you add a component dynamically:

UMyComponent* Comp = NewObject<UMyComponent>(this);
Comp->RegisterComponent();
Comp->PrimaryComponentTick.SetTickFunctionEnable(true);

RegisterComponent runs the standard tick registration. SetTickFunctionEnable then activates it. Without the explicit Enable call, runtime-added components may stay disabled even with bCanEverTick = true.

Blueprint Components

For Blueprint-only components, open the BP and find Tick under Class Defaults. Check Start With Tick Enabled and Can Ever Tick. These map to the same C++ flags.

Toggle at Runtime

Component->SetComponentTickEnabled(false);   // pause
Component->SetComponentTickEnabled(true);    // resume

Works after registration. Useful for performance: disable ticking for components that don’t need it in certain states (e.g., AI ticks off when far from player).

Diagnose

Add a UE_LOG at the start of TickComponent. If it never fires, the tick function isn’t registered. If it fires once and stops, SetComponentTickEnabled(false) is being called somewhere.

Console: showdebug componenttick lists tick functions for a selected actor.

Verifying

Build, run, attach the component. TickComponent should fire every frame. Disable the parent actor; ticking should stop. Re-enable; ticking resumes.

“UActorComponents don’t tick by default. Two flags in the constructor and the runtime takes over.”

When prototyping, default new components to ticking enabled — saves the “why isn’t it running” loop. Disable as a perf optimization later if you really don’t need it.