UFUNCTIONS are used to expose your methods to the Unreal System. I think of it like using Reflection systems in C# although it’s not strictly true.
Best way to decide if you need a UFUNCTION or not:
- Do you want to call this method in a blueprint?
- Should this method act as an event to call some blueprint code?
- Is this method being bound in any way?
If the answer to any of these is yes, add a UFUNCTION. In case 1 and 2, you’ll also need some additional specifiers such as BlueprintCallable or BlueprintImplementableEvent. More information on this is here: UFunctions | Unreal Engine Documentation
Whilst you’re at it, look at UCLASS and UPROPERTY too.