Known as Event Dispatchers on Blueprints side.

See also Binding to delegates

Dynamic delegate limitations

Dynamic delegates don’t support classes or structs that aren’t exposed to the Unreal Reflection System (eg. non-USTRUCT or non-UCLASS types)

Idioms for C++ delegates

Use DECLARE_DYNAMIC_MULTICAST_DELEGATE or its variants such as _OneParam or _TwoParams to declare blueprint-compatible delegate types.

For objects which send out events about updates to their internal state or such, it’s a good idea to send this as one of the parameters into the delegate. This makes it easy for the event receiver to handle events from multiple objects in the same handler without needing additional tracking for objects they care about.

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMyThingUpdated, class AMyThing*, UpdatedThing)
/* property definition */
FMyThingUpdated OnUpdated;
/* broadcast */

Using BlueprintAssignable allows blueprints to bind events into your delegate. Non-dynamic delegates are incompatible with BP’s.

How to make delegate parameter optional for Blueprints

How to make const ref params optional in blueprint nodes

Known issues / bugs / weirdness

If you have a delegate and for some reason it ends up saved into a blueprint asset, you can manually clear them out and resave the asset. See Fix blueprint corruption.