This section explains how to get all of the basic gameplay elements into your map. In this example we’ll set up a Deathmatch map, which is the easiest type to create. Capture the Flag and Warfare maps (and vehicle variants) have a couple additional node types you need to add, which are discussed at the end of this tutorial.
The following map files contain examples of the features discussed on this page. Feel free to use them as reference, or as a starting point for your own maps.
First off, naming conventions are important. They’re the primary way that Unreal Tournament 3 knows what type of map you’re playing. Start your map name with one of the following tags, depending on the intended gameplay type.
DM- (Deathmatch, Team Deathmatch, Duel)
CTF- (Capture the Flag)
VCTF- (Vehicle Capture the Flag)
So if you want to make a Warfare map called “FirePits”, you’d name it “WAR-FirePits.ut3”.
For this tutorial we’ll create a Deathmatch map. Start by creating a new map or opening an existing map you’ve created. Save it as DM-GameplayTest01.ut3 in the following folder.
My Documents\My Games\Unreal Tournament 3\UTGame\Unpublished\CookedPC\CustomMaps\
This is the official place where Unreal likes to look for maps, so get in the habit of saving everything there. (If you put the map somewhere else, especially if you’re streaming or loading separate packages, Unreal won’t be able to find it.) If you want to make a sub-folder, that’s fine too.
Build out your map so that it has at least three rooms connected by hallways, and that they’re not in a straight line. Something like this:
If you named it properly, Unreal will recognize this as a deathmatch map, and once we place the proper actors, Unreal will let you play it as a Deathmatch, Team Deathmatch, or Duel map.
If you’ve been following the tutorials so far, you may have noticed lots of errors that look like this.
Guess what? Unreal supports up to 16 players in Deathmatch, so we need to have at least 16 PlayerStart actors. Normally your level will be big enough that placing all of these spawn points makes sense (and you may place even more), but it probably seems kind of silly right now. That’s ok, we still want to place 16.
You can place a new PlayerStart node by right-clicking on the ground, selecting Add Actor, and clicking on Add PlayerStart.
If you’ve already placed one you can clone it around by alt-click-dragging on one of the move tool’s handles. Do this until you have 16 nodes spread all over your level. Try to make sure they’re at least 128 units apart if not more. (Remember you can middle-click-drag in a 2D view to use the measure tool.)
Also, see the little blue wireframe arrow pointing out of the nodes? That’s the direction the player will be facing when he/she spawns. You may want to rotate some of your PlayerStart nodes so that they’re facing in a sensible direction.
We’ll cover this in more detail in another tutorial, but you can test your map by clicking the Play in Editor button (the little black joystick at the top-right corner of the window.)
If your map shows up black, or just generally isn’t doing what you expect, you may have to hit “Build All” and try again.
Once you’re up and running properly, press the “Tab” key to bring up the console, and type “addbots 1”. A bot should appear somewhere in your level. Go kill it!
You can, of course, add as many bots as you want with that command, up to 16. Give it a try - it’ll be chaotic, but very rewarding!
Bots are stupid. All they know how to do is point at the nearest target and shoot, or run for the nearest pickup that’s in sight. They’re great at getting to things they can see. But how do they get from room to room? If their health is low, how do they find their way to a health pickup? Well, Unreal generates a path network that connects everything in your level. That way if a bot has no one to shoot, or is low on health, they know how to run through hallways to different rooms where there are goodies for them to pick up.
To start, click on the “Build Paths” button at the top of the screen.
Paths are automatically generated connecting every player start in the level. You can view your path network by clicking on the black arrow that’s at the top of a viewport and clicking on “Paths”. (Or you can just press the hotkey “p”.)
Any player starts that are in view of each other should now have a line connecting them.
But what do we do in a situation like this, where PlayerStart nodes can’t see each other? We definitely don’t want to move the PlayerStart, or add more.
Unreal has an actor called a PathNode, which does exactly what we want – we can place it in the hallway, and Unreal will connect our rooms together. Right-click on the floor, then select Add Actor->Add Pathnode. Or better yet use the shortcut – hold down the “.” key and click on the floor.
An apple icon appears. Click the “Build Paths” button and you should see some more connections. You may have to move the pathnode around (and rebuild paths) to get it to connect up, or you may need to add more than one pathnode.
Add a few pathnodes to your map now and make sure every room is connected by paths. Run the game, and add a few bots, and you’ll see they’re now able to traverse the whole space.
As I mentioned before, bots are great at getting somewhere if they have a line of sight, and a path network is a way for bots to find their way to areas they can’t see. Bots can use their line-of-sight trick to get to pathnodes too, so they’ll cut corners instead of following your path network rigidly. As a result, you don’t need to cover every square inch of a room with pathnodes – just the routes a player might follow. Most gameplay objects act as pathnodes too, so a player start or weapon pickup will fill in your path network in some areas.
The best way to learn how to make a good path network is to experiment. As a general rule, if the player can get through a space, you want to make sure there’s a path generated for bots to get through as well. When your level layout is getting detailed, start testing it with bots. Are there places the bots just don’t go? Do they get hung up in a hallway? Do they run really far out of their way to get somewhere? You may need to tune your network or add more pathnodes.
You can also learn a lot by looking at UT3 maps in the editor. Study how Epic places pathnodes in different situations.
Here are a couple pointers to get you started. Generally, you’ll need pathnodes in the following places:
- At every doorway or entrance to a room
- The bottom and top of a staircase or ramp
- Any place where a hallway turns a corner
- Any place where a bot can jump up or down from a ledge
- Any place where a bot should be able to use a translocator to get up to a ledge
- Around any large objects inside a room
You DON’T need to add pathnodes to these places:
- Along the length of a straight hallway
- In the corners of an empty room.
At some point you’ll probably place a pathnode that doesn’t add anything useful to the path network, like in the image below. (The path already goes all around the room, so why would we need the extra apple in the middle?)
If you have unnecessary nodes, you’ll get warnings like this:
Either delete the pathnode listed in the warning message, or move it around to a more suitable location. (Maybe it’s just a little too close to its neighbor, or not aligned with a hallway/stairwell/opening properly.)
You might be wondering what all the different colored and shaped paths are.
The coloration of the path line tells you what kind of a path it is (ground, flying, jump) and how wide it is.
- Blue - narrow path
- Green - normal width
- White - wide path
- Pink - very wide path
- Orange - Flying path, narrow
- Light Purple - requires high jump (higher than normal jump capability)
- Yellow - forced path
- Purple - "advanced" path (requires "intelligence" to be used)
- Straight lines mean the bot can run, jump, or crouch-walk along the path
- Curved lines mean the bot needs to use a translocator to take the path
And as a general guide for heights:
- Jump Height – 48 units
- Double-Jump Height – 88 units
(Note that if you jump and catch a ledge just right, you can actually get a little higher than this because you “step” up onto it..)
You’ll notice sets of pathnodes usually have two lines connecting them, and the lines end with an arrow. Those arrows indicate the direction in which the path runs. In the following example, bots can freely run between the pathnodes on the ledge, but can only jump down from the ledge to get to the pathnode on the bottom, not back up again. If this wasn’t your intention, you may need to lower the ledge, add a ramp or some stairs, or add some smaller objects the player/bot can jump on to get up to the ledge.
For more information on pathing and AI, see the following link
So you can run around your level and shoot stuff, but without weapon pickups, health, and armor, the level feels kind of dull. We can get at all of the weapon pickups (and a lot of other good stuff) through the Actor Class Browser.
Open up your Generic Browser, and click on the tab labeled “Actor Classes” (at the top of the window)
Finding pickups in the list is hard unless you know where to look. They’re all hidden under NavigationPoint. (That’s because, from a code standpoint, they’re all based off of the code that knows how to create paths.)
Open up NavigationPoint, then PickupFactory, then UTPickupFactory. You’ll start to see some of the things you’re looking for, like a Weapon Pickup Factory. You can open up subfolders to get at other object types, like Ammo, Armor, Health, Powerups, and Weapon Lockers.
Select one of the bold items (Say, UTPickupFactory_HealthVial.)
Now right-click in the world, and then click on “Add UTPickupFactory_HealthVial Here”.
As you’d expect, a health vial appears.
If you generate paths and run your map, you’ll be able to pick up the health vial to heal yourself, and bots will pick it up as well.
Most pickups (like the health vial) just require you to place them in the world and you’re good to go. But for weapon pickups and weapon lockers, you need to specify what kind of weapons will be available. Place a UTWeaponPickupFactory in your level (the same way you placed the health vial.) Make sure the object is selected in the world, then click on View->Actor Properties (or double-click on the object, or press F4).
Every object, even static meshes and brushes, have properties you can set. There are lots of categories in the properties window, and most of those categories (like Display, Movement, and Object) are used by every type of actor. In most cases you only care about the properties for the specific type of actor you’re working on. In this case, we want to set the weapon pickup factory properties, so click on the UTWeaponPickupFactory category. (It may be open already.)
You can now pick what type of weapon you want by clicking on the word “None” to the right of “WeaponPickupClass” and choosing one of the weapon options.
If you run the game, the weapon shows up.
WeaponLockers are a little more complicated to configure. Add a UTWeaponLocker_Content to your level, the same way you added the UTWeaponPickupFactory. Open up its properties and open the UTWeaponLocker category.
It looks like we can have a whole list of weapons, but right now there’s nothing in the list. (Click the little black arrow, you’ll see there’s nothing there.) To add more weapons to the locker, click the little green dot on the right side of the window. You’ll see that a new line appears underneath.
Open that up, and you can set the weapon class just like you did earlier.
Clicking the green dot multiple times lets you add lots of weapons to the locker. Mouseover the other icons too, they let you do other useful stuff like delete a weapon from the list.
One final note about pickups – when you build paths, you’ll probably notice warnings like this:
Don’t even worry about figuring out what pickup lights are, or placing them manually. Just go to Tools->Add Pickup Lights.
Lights will automatically be created over every pickup. If you’ve moved or deleted a pickup, the old light will be updated properly.
Jump pads launch the player into the air, ultimately to come down at a specified location.
To create a jump pad, you need to place a jump pad base, and then tell it where the player is supposed to land. But first, modify your level so that one of the rooms has a ledge or a platform big enough to run around on.
Placing a jump pad is the same as placing any pickup. It’s in the Actor Classes browser under NavigationPoint – it’s called UTJumpPad. Create one next to your ledge, about 128 units out.
Also place a navigation point on top of the ledge – the jump pad will eventually lead here.
We specify the jump pad’s target in its properties window, similar to how we specified what weapon a weapon pickup will spawn. So open up the jump pad’s properties window, and open up the UTJumpPad category. Aha! There’s a box labeled Jump Target. (And a few other controls, which I’ll let you explore on your own once the whole thing is hooked up.)
What we need to do is to plug our pathnode into the JumpTarget box. We need to select the pathnode and then click on the little green arrow to the right of JumpTarget, but selecting the pathnode would bring up its properties instead of the jump pad’s. So while you still have the jump pad selected, click on the lock icon in the top-left of the window. This locks the properties on the jump pad, no matter what you select.
Now select the pathnode, and click the green arrow next to the JumpTarget property. The path node name should fill in.
Now build paths. With any luck, you’ll see a curved line going from the jump pad to the pathnode. If you’re like me though, you got an error saying the jump can’t be made.
In my case, my ceiling was too low. I raised it and the jump pad works fine now. You might also run into problems if the jump pad is too close to the ledge, or the pathnode is too far from the edge of the ledge.
Now that you know how to create pickups and jump pads, you should be able to figure out any other gameplay object type. I’ll give a rough overview of some of the common ones here, without going into full detail. This section is meant to be more of a reference guide, but if you want to add some of these object types to your level now, it’ll be good practice.
To place a teleporter pad, select NavigationPoint->Teleporter->UTTeleporterBase->UTTeleporter and place one in your level. You’ll also need an exit point for your teleporter. You can either create another UTTeleporter (which will spawn with a base in the level), or you can simply select NavigationPoint->Teleporter for a one-way teleport destination.
Under the Teleporter properties there’s a field called URL. This is the “Tag” of the teleporter’s destination. Select the teleport destination, bring up its properties, and open up “Object”. In the Tag field, give it a name (like TeleDest01.) Go back to your original teleporter, and fill in the destination’s Tag under URL.
You can also easily make teleporters two-way by giving both a unique tag and setting each UTTeleporter’s URL to the other. You can even make a chain or loop of teleporters that all go to each other in order.
This helps bots make more intelligent choices in a CTF or Warfare game. Place UTDefense points around your flags or power cores, or any place where defense is important. Point the DefendedObjective parameter at the specific flag or power node you want the bots to defend. You can also type a name in the DefenseGroup field, and bots in defend mode will move between defend nodes that have a matching DefenseGroup name. There are a few other parameters as well, but they should be self-explanatory.
Building paths will automatically create some translocator jump paths, but sometimes you’ll want to force them (say, to get from a specific location to a powerup on a high ledge). Create a UTTranslocatorDest where you want the translocator to land. In the properties open up UTTranslocatorDest. You can now click the green button to add multiple StartPoint slots, and then connect them to PathNodes (using the Point parameter, just like you did with the JumpTarget on the jump pad.)
Lift (LiftCenter / LiftExit)
Lifts are a bit outside of the scope of this tutorial, but if you load up CTF-Strident, you’ll see one in action. Basically, the lift “Pad” is an InterpActor controlled by a matinee sequence so that it moves up and down on a timer (or it could be triggered via kismet to move when the player steps on it.)
A LiftCenter is a part of the path network that lets bots actually use your lift. It’s attached to the the InterpActor (under the LiftCenter’s properties, Attachment->Base). Attaching the LiftCenter makes it follow the InterpActor’s movement.
LiftExits are the other important part of the path network. They have a MyLiftCenter variable, which you need to point at the LiftCenter.
If anyone knows of a good tutorial on this, please let me know!
Vehicles are very easy to add to a map. Go into the Actor Classes window and open up NavigationPoint->UTVehicleFactory. Select the vehicle type you want, right-click, and add it to the level. In a VCTF or War game, the vehicle’s team will automatically be determined by who owns the objective node it’s closest to. (So if it’s placed closest to the blue team’s flag, it’ll belong to the blue team.) In a Deathmatch game, any bot will attempt to use the vehicle.
Of course, you need to make sure your level has spaces wide enough for the vehicle to pass through.
If you want to place a vehicle boost pad, select UTVehicleBoostPad from the main Actor Classes menu (not under NavigationPoint) and add it to the level like normal. A semi-transparent box with a scrolling texture will appear. You can non-uniform scale it to get it to fit the area you need. Remember to make it extra tall if you want it to affect flying vehicles. Under the object’s properties, you can control which types of vehicles are affected by it (like limiting it to the hoverboard). You can also control how much power the boost has.
Adding turrets to your level is more difficult, but here’s a forum post that outlines the process:
CTF maps are easy to create. There are only a few things that differentiate them from Deathmatch maps.
1) Name the file CTF-[mapname] for a standard Capture the Flag map, or name it VCTF for Vehicle Capture the Flag.
2) Add a flag base for each team. Find them in the Actor Classes browser under NavigationPoint->Objective->UTGameObjective->UTCTFBase->UTCTFBase_Content. Add them like you would any other gameplay object.
3) You also need to place a special kind of player start node, and tag it with the team that will spawn from it. You can place a Team PlayerStart node by selecting UTTeamPlayerStart in the ActorClasses browser under NavigationPoint->PlayerStart
Place one in the world, open up its properties, and open up the UTTeamPlayerStart category. Set the TeamNumber filed to 0 for the Red team and 1 for the Blue team.
You may also want to set up some UTDefensePoints, as described in the previous section.
Warfare maps are the hardest type to set up. Most of the information you’ll need can be found in this forum thread: