The first three generations of the Unreal Engine included a sandboxed
scripting language, UnrealScript, which provided a simple interface for gameplay
programming that was shielded from the complexity of the C++ engine.
The
scripting approach is very welcoming to new programmers, but eventually it
breaks down and becomes an obstacle to innovation and shipping. We experienced
this over time as the Unreal Engine grew until finally, in 2011, we moved to a
pure C++ architecture. The causative factors were both pervasive and
general:
- As an engine and its community grows, there is increasing pressure
to expose more of the its native C++ features to the scripting environment. What
starts out as a sandbox full of toys eventually grows into a desert of
complexity and duplication.
- As the script interface expands, there is a
seemingly exponential increase in the cost and complexity of its
interoperability or "interop" layer where C++ and script code communicate
through a multi-language interface for calling functions and marshaling data.
Interop becomes very tricky for advanced data types such as containers where
standard scripting-language idioms differ greatly in representation and
semantics from their templated C++ counterparts.
- Developers seeking to take
advantage of the engine‘s native C++ features end up dividing their code
unnaturally between the script world and the C++ world, with significant
development time lost in this Interop Hell.
- Developers need to look at
program behavior holistically, but quickly find that script debugging tools and
C++ debugging tools are separate and incompatible. Seeing where script code had
gone wrong is of little value if you can‘t trace the C++ that code led to it,
and vice-versa.
It is these reasons, ultimately, that led to Epic‘s move to
pure C++. And the benefits are numerous: UE4 is a unified and fully-debuggable
code base, freed from Interop Hell and totally open to programmers to study,
modify, and extend. There are side-benefits, too, such as increased performance
in gameplay code, and ease of integrating other middleware written in
C++.
Building Unreal Engine 4 as a unified C++ codebase has been very
freeing, giving engine and gameplay programmers enormous flexibility to write
code without unnecessary interop barriers.
This isn‘t to say that C++ is the
ideal language for simple gameplay code. It is more complex and more dangerous
than UnrealScript, C#, and JavaScript. But that is another way of saying that
it‘s more powerful.
By making peace with complexity and writing code in C++,
there is absolutely no limit to what you can accomplish, whether it involves
debugging your entire codebase in-context, interfacing to low-level engine
systems, modifying them, or talking to the operating system or advanced
third-party libraries.