Audience: Level Designers.
Last Updated: 07/21/99
Unreal levels can be huge; many of our game levels are pushing 20,000 world polygons. At any time, the player only sees a tiny fraction of those 20,000 polygons, typically 100-200 polygons. The engine spends a significant amount of CPU time figuring out which 200 polygons, out of a potential 20,000, are visible in each scene. Unreal employs several techniques to speed up this "visible surface determination" process. Most of these techniques are automatic, requiring no designer intervention. However, one of the most powerful techniques, zoning, requires level designers to manually place invisible polygons called "zone portals" in their levels. Zones greatly accelerate the engine's visibility calculations, and they also enable designers to create many special effects that are specific to a region of space, such as ambient lighting or modified gravity.
A zone is an non-convex interior region of connected 3D space, for example a room, or a group of several complex, interconnected rooms.
By dividing your map up into zones, you gain several benefits:
UnrealEd has a special mode that enables you to see your level's zones graphically, which each zone rendered in a distinct color. In UnrealEd, in the 3D viewport's menu, select "Zone/Portal view". You can also see this in the game by typing "RMODE 2" at the console.
In UnrealEd, zone portals are normally visible, and you normally can't see through them. To hide them, press the joystick button in the viewport, which turns on realtime updating of the viewport. You should only use this for previewing your architecture, as this realtime updating slows down the rest of UnrealEd's user interface.
Level designers can partition their levels into zones by using special kinds of brushes, zone portals, to seal up regions of their maps and make them "water tight".
There are two tools in UnrealEd that you need to use to create zone portals:
To zone your map, first you add a bunch of portal polygons (using the "sheet brush" tool to build them, and the "add special brush" tool to add them). Next, bring up the "rebuilder" dialog and rebuild you map. The rebuilder will go through your map and detect regions of space which are sealed up "water-tight" and assign a unique zone to each region. You can go into the "Zone/Portal" view to verify, graphically, that your level is properly zoned.
If, in Zone/Portal view, you see that the engine hasn't recognized your zones, you have probably not made the portals "water tight". You need to add in enough portals that the separate zones are completely sealed-off from each other.
If, in the game, you see "hall of mirror" effects where you placed portals, make sure your portals completely seal up the regions of space they separate. If you have a portal that only partially fills up a passageway, you might see through it into nothingness.
For special effects zones like water zones you will, of course, place the portals wherever you need the effect.
For zones whose purpose is only to speed up the engine, your goal is to divide your level up into zones while introducing portals whose overall area is as small as possible. The smaller the portals, the less work the engine must do to process the portals. Therefore, we place our portals in passageways which naturally separate large areas, such as doorways and hallways. This approach causes the level to be divided up well, without adding too much portal area.
There is no benefit (and often a performance penalty) to placing portals in the middle of large rooms. These huge portals usually eat up more CPU time being processed than they save. Stick portals in doorways, hallways, and other narrow passages.
If you want to assign individual properties to a zone, such as water, ambient lighting, or reverb, you need to add a "ZoneInfo" actor to the zone. You only need to do this if you want to assign custom properties to the zone; if all you want it the speed advantage of portalization, you don't need to add ZoneInfo's.
In the class browser, expand the "Info" class and you'll see "ZoneInfo" right there. You can add the ZoneInfo actor anywhere in your zone; as long as it's in empty space and there aren't more than one ZoneInfo's in your zone, the ZoneInfo will work. For the engine to recognize your ZoneInfo actor, you need to rebuild your map again.
See the ZoneInfo property sheet for a complete list of the ZoneInfo properties. There are many cool adjustable parameters, such as friction, gravity, ambient lighting, pain, water, etc.
To create a water zone, just set the ZoneInfo's bWaterZone variable to True. The Unreal physics code (in Pawn.uc and PlayerPawn.uc) automatically recognizes these water zones and transitions between walking and swimming physics modes.
To make transparent water, just select the zone portal's surface in UnrealEd, bring up the "Surface Properties" and turn its "Translucent" option on.