Quick answer: The most common cause is that the event dispatcher was never bound to a receiving function. Without a valid binding via BindEvent or AddDynamic, calling Broadcast on the dispatcher does nothing.
Here is how to fix Unreal Blueprint event not firing. You created a custom event or event dispatcher in your Blueprint or C++ class, wired everything up, and hit Play — but the event never fires. No errors in the Output Log, no crashes, just silence. This is one of the most frustrating debugging experiences in Unreal because the system fails quietly. The cause is almost always one of four things, and each one has a straightforward fix.
The Symptom
You have declared an event dispatcher (either as a DECLARE_DYNAMIC_MULTICAST_DELEGATE in C++ or as an Event Dispatcher in the Blueprint editor) and you are calling Broadcast() on it at the appropriate time. You have another actor or component that should respond to this event. But the receiving function never executes.
In Blueprints, you may have placed a Bind Event node and connected it to a Custom Event, but the custom event node never activates at runtime. In C++, you added AddDynamic in BeginPlay but your bound UFUNCTION is never hit when you set a breakpoint.
You might also have a replicated event in a multiplayer context — a function marked Server, Client, or NetMulticast — that executes on one machine but never reaches the others.
What Causes This
1. The dispatcher was never bound. This is by far the most common cause. Calling Broadcast() on a delegate with zero bindings does absolutely nothing. In Blueprints, it is easy to forget the Bind Event node or to bind it after the first Broadcast has already fired. In C++, forgetting AddDynamic or calling it too late in the initialization order means the listener misses early broadcasts.
2. Wrong object instance. You bound the event on one instance of an actor but are broadcasting from a different instance. This happens frequently with spawned actors — you grab a reference in the level blueprint at design time, but at runtime the actual actor is a newly spawned copy with its own dispatcher that has no bindings.
3. The bound function signature does not match. Dynamic delegates in Unreal require the bound function to have exactly the same parameter types as the delegate declaration. A mismatch compiles in some cases but silently fails to bind. In Blueprints, mismatched pin types on the Bind Event node prevent the connection from working.
4. Replication misconfiguration. For multiplayer events, the UFUNCTION specifier must match the call direction. A Server function must be called from an owning client. A Client function must be called from the server. Calling a Server RPC from the server itself does nothing. Additionally, the owning actor must have bReplicates = true.
The Fix
Step 1: Verify bindings exist before broadcasting. Add a check to confirm at least one function is bound to your dispatcher before you call Broadcast.
// In your header file
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChanged, float, NewHealth);
UPROPERTY(BlueprintAssignable, Category = "Events")
FOnHealthChanged OnHealthChanged;
// In BeginPlay of the listening actor
void AEnemyAI::BeginPlay()
{
Super::BeginPlay();
APlayerCharacter* Player = Cast<APlayerCharacter>(
UGameplayStatics::GetPlayerCharacter(GetWorld(), 0));
if (Player)
{
Player->OnHealthChanged.AddDynamic(
this, &AEnemyAI::HandlePlayerHealthChanged);
}
}
UFUNCTION()
void AEnemyAI::HandlePlayerHealthChanged(float NewHealth)
{
UE_LOG(LogTemp, Warning, TEXT("Player health: %f"), NewHealth);
}
Step 2: Confirm you are referencing the correct actor instance. Log the object pointer when binding and when broadcasting to make sure they match.
// When binding
UE_LOG(LogTemp, Warning, TEXT("Binding to dispatcher on: %s (%p)"),
*Player->GetName(), Player);
// When broadcasting
UE_LOG(LogTemp, Warning, TEXT("Broadcasting from: %s (%p)"),
*GetName(), this);
// Check if anyone is listening
UE_LOG(LogTemp, Warning, TEXT("Bound count: %d"),
OnHealthChanged.IsBound() ? 1 : 0);
OnHealthChanged.Broadcast(CurrentHealth);
Step 3: Fix replication for multiplayer events. Ensure the UFUNCTION specifier, actor replication, and call site are all aligned.
// Server RPC - must be called from owning client
UFUNCTION(Server, Reliable)
void ServerRequestFire();
// Client RPC - must be called from server
UFUNCTION(Client, Reliable)
void ClientPlayHitReaction();
// Multicast - called from server, runs on all
UFUNCTION(NetMulticast, Unreliable)
void MulticastPlayExplosionFX();
// In constructor: enable replication
AMyActor::AMyActor()
{
bReplicates = true;
}
Related Issues
If your events fire but your character does not respond with movement, check our guide on CharacterMovementComponent not working. If events trigger gameplay logic but your UI does not update, see UMG widgets not showing on screen for common widget visibility issues.
Log the pointer address. If binding and broadcasting show different addresses, that is your bug.