Quick answer: Set PrimaryComponentTick.bCanEverTick = true in the constructor and verify bStartWithTickEnabled = true. The owning actor must also tick. To toggle at runtime use SetComponentTickEnabled. For Blueprint components, the Event Tick node must be present in the graph.
Here is how to fix Unreal Actor Components whose TickComponent override is never called even though the actor itself ticks. You overrode the function, the component is attached, the actor is in the world — but breakpoints inside TickComponent never hit. The cause is almost always the bCanEverTick flag in the constructor, defaulting to false for performance.
The Symptom
An ActorComponent (or UMyComponent) declares virtual void TickComponent. The component is attached to actors in the world. The actor’s own Tick fires correctly. The component’s TickComponent never runs. No errors.
What Causes This
bCanEverTick defaults to false. ActorComponents disable ticking by default to save CPU on components that do not need it. You must opt in.
bStartWithTickEnabled false. Even with bCanEverTick true, you can configure components to start disabled and enable later. Check both flags.
Owner not ticking. Components inherit some scheduling from owners. If the owner has bCanEverTick false or is set to tick group None, components may not get scheduled.
Tick group misconfiguration. If the component’s tick group does not exist for the world (custom dependencies missing), the tick is dropped silently.
The Fix
Step 1: Enable tick in the constructor.
// MyComponent.cpp
UMyComponent::UMyComponent()
{
PrimaryComponentTick.bCanEverTick = true;
PrimaryComponentTick.bStartWithTickEnabled = true;
PrimaryComponentTick.TickGroup = TG_PrePhysics;
}
void UMyComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
// your tick logic
}
Step 2: Toggle at runtime if needed.
void UMyComponent::ActivateLogic()
{
SetComponentTickEnabled(true);
}
void UMyComponent::Pause()
{
SetComponentTickEnabled(false);
}
Useful for components that should only tick during gameplay states (combat-only AI, paused HUD).
Step 3: Confirm the owner ticks. Check the owning Actor’s constructor:
AMyActor::AMyActor()
{
PrimaryActorTick.bCanEverTick = true;
}
If the actor is set to never tick, components on it may also be skipped depending on configuration.
Step 4: For Blueprint components, ensure Tick event exists. Open the Blueprint, drop a Right Click → Add Event → Event Tick. Without it, the Blueprint side never executes even if C++ TickComponent runs (they are separate paths).
Step 5: Use a UE_LOG to confirm scheduling.
void UMyComponent::BeginPlay()
{
Super::BeginPlay();
UE_LOG(LogTemp, Log, TEXT("BeginPlay on %s, tick=%d"),
*GetName(), IsComponentTickEnabled());
}
If the log says tick=0 even though you set the flag, check the constructor signature — if your component is added via reflection at runtime (UAddComponentTo...), the constructor may not run as expected.
Performance Considerations
Enabling tick on every component is unnecessary. For most one-shot components (handle a hit, apply a buff, send an event), skip ticking entirely and use timers or events. Tick is a per-frame cost on every active component.
“bCanEverTick is the gate. Without it, no tick. With it on, you can toggle at runtime via SetComponentTickEnabled.”
Related Issues
For Anim Blueprint state issues, see Anim Blueprint State Machine. For physics constraints, see Physics Constraint After Load.
Constructor sets bCanEverTick. Owner ticks too. SetComponentTickEnabled for runtime control.