EditXXX means the variable is meant to be changed in the editor while making the game. Note the word “Edit” , implies editor stuff.
EditDefaultsOnly Allows you to set Only a default value for a variable in the blueprint window which will be same for all objects of the type. You cannot change this variable in editor after you’ve put it in the map.
EditInstanceOnly Allows you to set separate values of the variable for every object you place in the map , but you cannot set it in blueprint before you put it in the map, The default value for this variable can be set in C++ constructor.
EditAnywhere Allows both of above!
As seen Editxx will allow you to edit the variables defaults value but will not allow you to read or write its value in a Blueprint Graph
To be able to read or write a variables value in Blueprint Graph or Logic you’ll need BlueprintReadOnly or BlueprintReadWrite alongside the EditXX like (EditDefaultsOnly,BlueprintReadOnly)
BlueprintReadOnly or BlueprintReadWrite Controls whether the variable show up in graph nodes.
VisibleXXX indicates where your blueprint variable should be visible , Visible as in its value and representation and not scope visiblity. but you cannot change its defaults value.
Whether you can read write a Visible marked variable depends again on BlueprintReadOnly or BlueprintReadWrite
Now you’d wonder why some components are marked (BlueprintReadOnly , VisibleDefaultsOnly)
In this case you’re not allowed to change the variable itself since its Marked BlueprintReadOnly . The variable here is a pointer! A pointer to your component!
So you have privilage to edit the properties in the component itself because they belong to the component and not the actor , But you cannot change everything your variable is pointing to in the defaults.
You need VisibleDefaultsOnly with it so that you can actually see it in the defaults window before changing component’s properties and BlueprintReadOnly Makes sure you don’t make changes to component as a whole!
If you mark it as EditXXX then all the properties of the component as a Variable will be exposed. Which we don’t always need
Hope that clears things up