The UINTERFACE/IInterface pair function like they do in other recipes, with the UInterface containing reflection information and other data and the IInterface functioning as the actual interface class that can be inherited from.
The most significant element that allows the function inside IInterface to be exposed to Blueprint is the UFUNCTION specifier. BlueprintCallable marks this function as one that can be called from the Blueprint system.
Any functions exposed to Blueprint in any way require a Category value. This Category value specifies the heading under which the function will be listed in the context menu.
The function must also be marked virtual – this is so that a class that implements the interface via native code can override the implementations of the functions inside it. Without the virtual specifier, the Unreal Header Tool will give you an error, indicating that you have to either add virtual or BlueprintImplementableEvent as a UFUNCTION specifier.
The reason for this is that without either of those, the interface function wouldn't be overridable in C++ (due to the absence of virtual) or Blueprint (because BlueprintImplementableEvent was missing). An interface that can't be overridden, but only inherited, has limited utility, so Epic have chosen not to support it within UInterfaces.
We then provide a default implementation of the OnPostBeginPlay function, which uses the GEngine pointer to display a debug message, confirming that the function was invoked.