GENERATED_BODY() is an epic defined macro which every UCLASS requires.
You are correct on beginplay.
Variables and functions are two completely different things, you should read up on tat topic.
public, private and protected defines the accessibility of your class members. private means they cannot be used outside of the actual class they live in, protected means the same as private when it comes to accessing the code, but the crucial difference comes with inheritance here. If you create a child class from a base class you can access public and protected members. While private members are technically inherited as well, you cannot access them. So, to keep the access private but make it available in a childclass you can use protected. public simply means it can be accessed from anywhere. There is this general rule that says that variables should generally be private/protected and methods should be public. But to every rule there is an exceptions and you will actually see Ben make a bunch of them in the course and once you code more you will start to do that too. Sometimes you have some kind of helper function that you use to keep your code cleaner and readable or something that you need to do very often but only inside your class, it makes sense to keep such a function private/protected. Also, you might do the bad bad thing of making a variable that you often use public and not use getters and setters - until your code has several thousand lines and you hate yourself for making that decision in the beginning :^)