Unreal Engine Components
The Unreal Engine contains several components. Each can work independently, but they’re kept humming along in harmony by a central “core engine.” Since everything’s neatly modularized, licensees of the Unreal Engine’s technology can easily customize or replace any individual component without drastically changing the core engine (and raising costs or delaying delivery—two of the industry’s worst no-nos). This section introduces you to each Unreal Engine component, and shows how they work together to deliver an Unreal gaming experience.
The Graphics Engine
The graphics engine controls what you see while you’re playing a game; it produces the jaw-dropping visuals that appear as you blast your way to victory. Without it, you’d just see a tremendous list of ever-changing property values, such as the player’s location, health, any weapons they are carrying, ammo, what animation is currently playing, and so on. Fat lot of fun that would be. Thankfully, the graphics engine translates this information into the lush environments you see during gameplay (see FIGURE 1.13).
Figure 1.13 The graphics engine is responsible for turning vast lists of properties into interactive imagery on the screen.
The graphics engine is responsible for “behind-the-scenes” calculations few players ever think about. For example, it determines which objects display in front of others, and which objects should “occlude” (hide) others from view.
In Unreal Engine 3, when you occlude “rear” objects from view, they don’t render at all. That frees up processing cycles for something more useful. Previously, developers had to perform these intricate manual level optimizations themselves. Now, Unreal Engine 3 handles that for you—just one way it’s been optimized to improve performance and save you time.
Certain aspects of level optimization are still in place, and work with the rendering engine to help control what the player can and can’t see. Unreal Engine 3 supports Level Streaming, which allows different sublevels to be loaded or unloaded from memory during gameplay. With Level Streaming, when a player enters one section of a level, the area he’s exiting can be dumped from memory and no longer rendered by the graphics engine. This means you can present the player with truly vast environments without ever exposing them to a loading screen or a break from the action. For more about Level Streaming, see Chapter 12, “Level Streaming.”
The Unreal graphics engine also renders the various shaders and materials that are applied to all your objects. (For now, all you need to know about shaders is that they give you a lot more flexibility in controlling how your graphics render.)
As we’ve mentioned, one important part of rendering is lighting. Unreal Engine 3 boasts an extremely robust lighting system. That allows for dynamic lighting and shadowing, soft shadowing effects, and, well, more realism. You learn a lot more about this in Chapter 7, “Introduction to Lighting.”
The Sound Engine
It’s been said that 90 percent of what you perceive is in what you hear. Indeed, even the most visually entertaining films and games lose their punch with the sound turned off. Many players take the nuances of game sound for granted, not realizing the tremendous sound layering that takes place in today’s games: the active sounds of the player running through sand, the shattering of glass, the report of gunfire, the ambient noises such as running water or wind and rain... even the dynamic, fully orchestrated soundtracks that change as the action changes. There’s a lot to sound in games these days.
The sound engine makes these effects possible in your game. It takes all the sound effects you’ve recorded and imported, queues them based on certain events in the game (such as playing an explosion sound when a grenade is thrown), and re-creates them as closely as possible, using the sound hardware built into the computer or gaming console.
Unreal Engine 3’s sound engine is surprisingly easy to use. You import your sound effects or music, and use them to construct SoundCues—lists of instructions that control how sounds are played. For example, SoundCues might control whether a sound loops, whether its pitch or modulation should be tweaked, or whether it should be combined with other sound bites.
The Physics Engine
You live in the universe. You see how objects react when they bounce off each other. At a deep, instinctual level, knowledge of the laws of physics is built right into you. But that knowledge isn’t built right into your PC or game console. If you want realistic collisions and explosions in your game, those have to be programmed. Trust us. You don’t want to have to do that on your own. With Unreal Engine 3, you don’t have to; your in-game physics are handled through NVIDIA’s state-of-the-art PhysX physics engine.
PhysX supports a whole laundry list of physical simulations, including rigid bodies, constrained bodies, dynamic skeletal meshes (think “ragdolls”), and even cloth. Each of these can be interactive in the game and can be manipulated by the player, either directly or through scripted sequences. The physics system can also work with the sound engine to produce dynamic sound—say, whenever a physics-driven object strikes the ground (see FIGURE 1.14).
Figure 1.14 Using the physics engine, characters can turn into ragdolls.
The Input Manager
Without inputs from a player, you don’t have a game; you just have a piece of game engine-driven animation, or “machinima.” As a gamer, you know where these inputs come from: button presses, mouse movements, applications of pressure to analog controls—nowadays, maybe even vocal commands. Whatever its source, each input must be recognized, and then converted into a command that tells your game how to react. In Unreal Engine 3, that’s the job of the Input Manager.
Each time a player produces an input, the Input Manager sets a series of properties that control what should happen in the game. For example, when a player presses the “Jump” button, the Input Manager sends a signal to the core engine, which causes it to play a jump animation, send the relevant information to the graphics engine to render that action on the screen, and queue a jump sound effect from the sound engine. All that happens very quickly; so fast, players almost never notice the delay between their input and the game’s reaction.
One great thing about Unreal Engine 3’s Input Manager is that it’s extremely flexible. You can adjust easily when you’re moving between different gaming platforms or input devices.
As Epic Games developed its Unreal Tournament series, it learned more about fast, efficient multiplayer gaming than just about anyone else – and those lessons are built into Unreal Engine 3’s highly optimized network infrastructure.
During a multiplayer game, each player’s computer is in constant communication with another computer that acts as a server. This server computer can also run a “client” application, which means another player can actually join in and play from the server computer. When a computer is running strictly as a server (with no client), it’s called a “dedicated server.” Dedicated servers are generally preferred for online gaming, as the server can use all its resources for serving, not playing.
The key to efficient network gaming is to limit the data that’s sent across the network to only the most important aspects of gameplay, such as each player’s position and interactions with his immediate environment. By sending only the most relevant details, you can have very fast gameplay even on slower connections. The Unreal Engine has been designed to do just that.
The UnrealScript Interpreter
UnrealScript is one of the most revolutionary aspects of the Unreal Engine. It’s a scripting language that allows programmers or users to adjust virtually anything the Engine is doing, without touching the actual game source code. UnrealScript may be the #1 reason why so many people are out there creating mods and new levels for games that run on the Unreal Engine.
If you’ve done much programming, you may find UnrealScript familiar. In many respects, it’s a lot like the popular languages Java and C++. But, as a scripting language, it’s intended to be relatively easy—in fact, its creator, Tim Sweeney, said that where he had to make tradeoffs, he chose simplicity over execution speed.
The UnrealScript Interpreter is the component of the engine responsible for transforming the UnrealScripts you create into code that the engine can process (see FIGURE 1.15).
Figure 1.15 The UnrealScript Interpreter
(Note that this book won’t focus on UnrealScripting. It’s primarily intended to cover artist-level game asset creation.)