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.