Is Unreal slowly becoming its own language?

I’ve been migrating one of my projects to UE 5.8 these last couple of days and… I don’t know. Maybe it’s just me, but I keep getting this feeling that every version pushes Unreal a little bit further away from plain C++.

I’m not talking about UCLASS, reflection or the object system. Those have always been part of Unreal and that’s fine.

I’m talking about all the little things.

One example:

UE_LOG(LogTemp, Error, TEXT("%s"), e.what());

Now it has to be %hs because e.what() returns const char*.

Sure, changing it takes 5 seconds. That’s not really the issue.

Then I hit another one. A float x; sitting in one of my tutorial headers suddenly starts producing an error inside Chaos because of the Shared PCH. Again, once you understand what’s happening, it makes sense.

That’s kind of my point.

None of these things are difficult. But they keep adding up.

After a while I feel like I’m spending more time remembering Unreal-specific rules than actually writing C++.

Sometimes I honestly wonder whether I’m writing C++ anymore or just Unreal’s own dialect built on top of C++.

Maybe that’s unavoidable for an engine this big.

Maybe it’s the cost of reflection, generated code, the build system, Blueprints and everything else.

But I’d expect the long-term direction to be getting closer to modern C++, not introducing more engine-specific conventions.

I’m curious if other people migrating to 5.8 have had the same impression, or if this is just something you stop noticing after enough years using the engine.

%hs isn’t the problem. It’s not a new specifier. What bothers me is having to know an increasingly specific Unreal formatting rule just to log a standard C++ exception.”

Yeah i had to change my old documentation to use the new LOGFMT, even though i kinda like that new format.

I might just create a custom global function for something like Print(‘message’) such that if it changes again, i can just edit it in one place.

But this is sure kinda annoying, i created a timer delegate before, but it is now no longer working, in addition to a pointless documentation that i written long ago just for that.

Even in blueprint nothing is really 100% backwards compatible, my custom material transparency didnt work out when migrating to 5.8 and there were a glitch from a texture rendering target(camera component 2d capture), the solution was just to remove the camera from the level map, and re-add it.

This does add up when you made so many documentation on both bp and cpp. And i guess will get worse with ue6.