Unity Engine - Bunker Design Doc v1

With a couple of Unity tutorials finished, I think I have enough of a toolkit to make my game happen. So it's about time I explained my basic motivation for this game, and planned an implementation. It's very likely that I will need to modify and add ideas as development continues, but this is my starting point.


Bunker is a game about paintball. For the unfamiliar, paintball is a sport where players shoot balls of paint at eachother while moving around a field and hiding behind cover (bunkers). When a player gets hit, they're out.  Paintball has been represented in video games before, usually as a First-Person Shooter (FPS), but I feel like those games somewhat missed the point.

In a typical FPS, you win by aiming faster and more accurately than your opponent, and exchanges of fire don't stop until one player is eliminated. This works because guns are so accurate and (with direct mouse control) so easy to aim that an elimination is virtually guaranteed within a second or two.

But in my experience, this isn't how paintball works. Paintball guns are very inaccurate as range increases, especially for low-budget gear. Shooting at a target 20 meters away, your paintballs might spread half a meter in any direction. Meanwhile, a smart opponent will be pressed into cover, exposing nothing but a bit of head, some arm their paintball gun. I would guess the total target area is about 40cm x 20cm. Paintballs also have a very low velocity meaning that over extended ranges, perhaps 60 meters, you can see them coming and actively dodge them.

So when paintball players exchange fire, using cover and beyond 20 meters, a hit is not guaranteed within the first couple of seconds.  Players can (and sometimes do) choose to sit still and keep rolling the dice for several seconds until one of them gets hit or runs out of ammunition.  But the other option is to disengage and find ways to push the odds in your favor.

How do you push the odds?

First, by shooting when your opponent can't shoot back. In a 1-on-1, this is accomplished by escaping your opponent's sight and reappearing in an unexpected location. If you remember where they are, you will be able to aim and shoot before they notice you.

Second, by making the opponent a bigger target than you. You need to move to the side or back of the opponent's cover to bring more of their body into view, while keeping your own body hidden.  Of course, if you move between cover while your opponent is watching, they will be able to freely shoot at you and reposition to nullify whatever flanking advantage you would've achieved.

My goal with Bunker is to simulate the behaviours above. Players should be able to shoot at eachother with a chance of hitting determined by their range and the cover between them, move between cover and break line-of-sight.


Game Flow: The character and their opponent spawn at opposide ends of the field, and when a character is hit the game ends and a victory or defeat message is displayed, along with an option to restart with the previous field layout or a random new layout. While the game is running, the player can pause the game at any time and issue commands.

Environment: The game is played on a walled-in plane (the field), with random obstacles scattered around (bunkers). Bunkers break line-of-sight, and stop any paintballs which hit them.
The game will be viewed from an orthographic, top-down perspective.

Movement: Charaters can be attached to one bunker at any time, and move between bunkers.  While atached to a bunker, the character can temporarily lean out of cover to see and fire beyond the bunker, while presenting a small target.

Line-of-sight: Line-of-sight is blocked by bunkers, but a character can see beyond their current bunker by leaning. When the player has direct line-of-sight to their opponent, the opponent will be rendered.

Last-known-position: When a character does not have line-of-sight to the opponent, that character will "remember" the last position where they saw the opponent. The character will "pre-aim" at that position, allowing them to begin firing sooner when line-of-sight is reestablished. Both the player and the opponent's last-known-positions will be rendered.

Aiming: When a character establishes line-of-sight is established with an opponent, their aim automaticlly moves towards the opponent. The time it takes to aim increases when the opponent is further from their last-known-position. If the player thinks their opponent has moved away from their last-known-position, the player can override their last-known-position to pre-aim on any arbitrary position.

Firing: When a character is fully aimed at their opponent with direct line-of-sight, the character begins firing. Shots are randomly distributed in a cone from the character towards the opponent, and this cone is rendered so that the player can determine their chance of hitting. Shots are destroyed when they collide with a wall or bunker, and perhaps when they collide with other shots. If a character moves while firing, their aim will continuously adjust to stay on target but they may suffer an increased cone-of-fire.

Player Controls: Move to a bunker by left-clicking on it, and determine the player's exact position around the edge of the bunker by clicking and dragging in a direction. Spacebar pauses and unpauses the game. Choose a pre-aim point by right-clicking that point on the field.

AI Opponent: This character  has the same behaviours as the player character, but its movements are determined by a decision tree in response to what the player character does. Determining a fun AI decision-machine will require playtesting, meaning the game's other systems must be implemented first.