I’ve had my first taste of Unreal Engine over the last few months. I haven’t touched unreal engine before, so this is deep water to me.
I’ve been working with Unity for the last 2-3 years. I’ve hardly used c++ since then. Jesus christ you forget what a total fucking nightmare it is. You look at something like Unreal where they have 3 layers of bullshit on top of everything, and you think.. shouldn’t the language be doing this? Should your code be covered in macros to the extent that you can barely tell what language you’re programming in? Should you be pre-processing and generating code? Should precompiled headers ever be a thing?
To be clear, I’m not blaming UE for this. It’s what it needs to do. The issue is that c++ is a bunch of shit. Trying to use intellisense is an ordeal. I’m guessing this is mainly on Microsoft – since they seem to have more sense than to try to code stuff in c++ anymore, the intellisense has always been pretty junky compared to c#.
The engine itself is a lot more bare basics than I thought it was. For some reason I was under the impression that it was kind of like Source, in as much that it had the main menu, server joining, all the basic deathmatch stuff built in. But it’s a lot closer to Unity than that. It has barely anything, and you add the rest. No main menu system, no player weapon system, no health + dying system. This kind of took me by surprise at first, but I can see why it makes sense.
Another thing that took me by surprise was the client/server split. In Source it’s clearly defined. Client stuff in the client dll, Server stuff in the server dll, completely separate client and server entity definitions. In Unreal it’s different. Instead of checking that you’re a server, you check to see if you have authority on that entity. If you do, you do authoritative stuff. And then it all just works. This seems to be a lot simpler.
Networking in Unreal has a bunch of gotchas. There isn’t any interpolation – apart from players. So if you make a physics object on the server, on the client it’s going to stutter around unless you add your own solution. Any kind of latency causes the default player controller to really suffer when interacting with physics objects, dragging back and teleporting out of its way. The default bandwidth targets are quite low, so what you think are bugs turn out to be the network system trying to prioritise what to send.
If you’re not using Blueprints you’re going to struggle. The whole engine is angled to use blueprints, so when you’re doing stuff via c++ you find yourself reading tutorials on how to do stuff using blueprints then backwards engineering that into c++.
It has a weird plugin system. Some things, like shader includes, have to be copied to the engine folder in your program files. This means when you’re adding your game to source control you need to tell everyone to install specific plugins instead of just including files in the project folder.
But on the plus sides, fuck me, how gorgeous is this engine. You can throw anything at it and it renders it so beautifully. And it’s so open. Instead of wrapping physx up in a layer of their own shit, it’s right there, exposed, so you can tweak all the internal settings to improve the quality of the physics for your engine. It performs really well for me so far. And full source code access is always a big draw.
You’re probably thinking.. fuck me dude, why are you using this engine if you hate it so much. The thing is, it’s all irrelevant. I’m wrapping it in c#. Once that’s done we shouldn’t have to open the editor or the c++ that often 😉