When to use UFUNCTION() macro?

complementing Rama’s answer: whenever you use “void BindUFunction( UObject* InObject, const FName& InFunctionName )” for binding delegates.

For instance when you want to use FTimeline:

FOnTimelineFloat InterpFloatFunction = FOnTimelineFloat();
InterpFloatFunction.BindUFunction(this, "ThisFunctionShouldBeMarkedAsUFunction");
    
FTimeline MyTimeline = FTimeline();
MyTimeline.AddInterpFloat(SomeCurve, InterpFloatFunction, "InterpFloatFunctionName");