Why does this suck so badly?

IMO part of the issue is that the script layer is collapsed into the native layer and it’s easy to confuse the two.

A long time ago, in the UE3 days, there was UnrealScript… And a clear delineation between gameplay “scripting” and engine “engineering”. The serialization, reflection, etc - all that was generally “script layer” type business.

But UnrealScript was very limiting for those used to C++, etc, and as people requested more and more features be pushed into UnrealScript - eventually Epic was like “efff it. We already have C++, why are we reinventing languages? Let’s just use that for the script layer, too.”

So, what you see when you look at a project in cpp is sort of two layers collapsed into one, and they’re two completely different ways of thinking. If you’re not acclimated to BOTH sides (engine vs gameplay script) then the other half looks like a mess. In general, where you see all the UPROPERTYs and UFUNCTIONs, that’s the old script layer, now expressed in C++ instead of UnrealScript. But the two layers intersect unless purposefully kept apart, which makes it confusing.

IMO it’s an improvement, even though there’s no forcing function to separate the script logic layer from the engine layers that was the UnrealScript/C++ boundary back in the UE3 days.