Works in Unreal Engine 5. Tested on UE 5.8. Updated October 2026.
Quick answer: check these first. They cause almost every AddDynamic problem:
- **The function needs
UFUNCTION()above it** in the header. Without it, AddDynamic can’t find the function and the log says *”Unable to bind delegate”*. - **Bind in
BeginPlay, not in the constructor.** - The parameters must exactly match the delegate. For OnComponentBeginOverlap, copy the parameter list from the engine.
- For overlap or hit events, turn them on: Generate Overlap Events for overlaps, Simulation Generates Hit Events for hits.
A working example
// Header
UFUNCTION()
void HandleHealthChanged(float NewHealth);
// BeginPlay
HealthComponent->OnHealthChanged.AddDynamic(this, &ATrainingDummy::HandleHealthChanged);
The handler never runs
Go through these in order:
- Missing UFUNCTION(): the Output Log shows *”Unable to bind delegate to ‘HandleHealthChanged’ (function might not be marked as a UFUNCTION or object may be pending kill)”*. Add
UFUNCTION()and rebuild. - Bound in the constructor: move the AddDynamic call to BeginPlay.
- Overlap or hit events are off: on both components, enable Generate Overlap Events, and make sure their collision settings overlap or block each other.
- Nothing calls Broadcast: for your own delegates, make sure your code calls
OnHealthChanged.Broadcast(...)after you bind, not before. - You bound to a copy: if you got the delegate through a function that returns a copy, your binding is lost. Get it by reference instead.
- The listener was deleted: if the object you bound gets garbage collected, its binding silently stops. Keep a
UPROPERTY()reference to it.
Added a UFUNCTION with Live Coding?
Live Coding doesn’t reliably pick up new UFUNCTIONs. Close the editor and build from your IDE, then open the project again.
Compile errors
- “does not have an overloaded member operator ->”: use
OnHealthChanged.Broadcast(...)with a dot, not->. - “__Internal_AddDynamic is not a member”: the delegate isn’t a dynamic multicast delegate. Use
BindDynamicfor single delegates, orAddUObjectfor non-dynamic ones. - Signature errors: the handler’s parameters don’t match the delegate. Copy them exactly.
Bound twice?
Calling AddDynamic twice with the same function triggers an ensure. Use AddUniqueDynamic if your bind code can run more than once.
FAQ
Why does AddDynamic need UFUNCTION?
Dynamic delegates find your function by name through Unreal’s reflection system, which only knows about UFUNCTIONs.
Should I bind in BeginPlay or the constructor?
BeginPlay. Bindings made in the constructor can be lost when the actor is loaded.
How do I unbind?
Call RemoveDynamic with the same object and function, for example in EndPlay.