Can anyone please explain what’s the difference between them? Cause the docs only list them, but they don’t say how they act any differently. They all have the same “explanation” actually, which is:
…can be added to the declaration to control how the class behaves with various aspects of the Engine and Editor.
Not only that, but some of them are common to both list types, such as the “DisplayName” specifier for example, which makes things even more confusing…
Describes them all and gives examples on how to use them.
Regular ones generally get turned into property flags (int based flags) and meta ones are stored as strings/whatever in the property reflection meta data.
I knew about that link, it’s amazing for further explaining the individual nuances of each specifier, past what the UE documentation is doing, however I did not find any satisfactory explanation on the overall difference I was asking for.
Therefore, after some further help on Discord (especially from you, @Daekesh thank you so much!!! ) and 12 more hours of playing with a test class where I experimented with virtually all weird combinations of specifiers, I can summarize my own answer as follows:
The “regular” specifiers are specific to their respective types (e. g. a “regular” specifier for Class applies only to a Class, not to a Function or Property and vice-versa), unlike the “meta” specifiers which are more general-purpose in their nature and can be seen as “common” across multiple types like Class, Function, Property etc., thus having a lot of overlap (they’re not all common, but a good portion of them are)
The “regular” specifiers are addressed to the behavior customization of Unreal Engine’s Editor GUI and once they do their job (setting whatever it is they’re meant to), they’re “consumed” (aka they don’t propagate any further), whereas the “meta” specifiers do pass on deeper into the engine, being able to still be parsed/interrogated for further actions based on their values
The “meta” specifiers are generic string types, meaning you can also use them as custom user-made ones (think of them as possible freeform tags), used for your own specific needs, not just the standard UI behavior customization we’re used to
There are probably way more differences than these and my understanding might not be 100% accurate, but after hours of experimentation and playing around with them, I feel confident enough in saying that the above summarization is a good place to start if you happen to struggle with the same dilemma as I was