Game development has always been about metrics. Even the simplest games needed a basic set of variables around which the mechanics could be balanced. How fast does the character move? How high can he jump? How fast do the projectiles fly? As games have become more complex and teams larger, metrics have taken on an even greater importance. The game programmers want to know the player’s stats so that AI can be properly balanced; the level designers need to know how far the player can jump so that they arrange accomplishable paths through their block outs; modelers might need to know the player’s crouching height so that they can design usable cover objects.
Although one can arrive at these values via experimentation (and play testing should always be used to double-check) it’s best to think critically about the details surrounding the metric you want to lay down.
Take the relatively common problem of horizontal jump distances in first person shooters, for example. Say you’re working in an engine where the game units are equivalent to 1 centimeter and you’d like the player to be able to comfortably jump 4 meter gaps. Your first guess would probably be to set the player’s jump distance at 400 units. If you’re forward-thinking, you might make it 412 or so to provide a little bit of forgiveness.
Your first test of this setting is likely to be quite surprising: you’ll almost certainly find yourself falling well short of clearing your 400 unit gap. Why would this be the case? Let’s take a look at some screenshots from Valve’s Half Life 2: Episode 2 and see if we can spot the problem.
In this screenshot you can just barely see the edge of the ledge I want to jump from (highlighted in red.) Once this edge leaves the bottom of my field of view (FOV) it is essentially out of my mind. Since I can’t see it anymore, my brain will reflexively start my jump right before or just after that moment. However, if we look at this next screenshot, you’ll see that in reality I’m quite far away from the edge!
The reason for this is straightforward: the height of the player’s camera (eye-height) and the vertical FOV angle create a predictable blind spot in front of the player character’s feet. Depending on these two values, the point at which the edge disappears from the player’s view can be a quite far. In my experience, this additional distance can easily be as much as 70% of the camera height with a wide-screen FOV of 70 degrees. The blind distance increases as the FOV angle decreases, which makes sense since narrowing the FOV is how one accomplishes zooming (such as with a sniper rifle.)
Notice how this issue can also be affected by the player’s view pitch.
Some players will naturally look down as they approach a jump, which means they’ll be able to get much closer before losing sight of it. A player who leaves their view flat will have less distance, and players who happen to be looking up will find themselves with significantly less distance! Below is a quick diagram I whipped up to show the relevant values that determine this player blind spot.
With this information in mind, in order to create a newbie-friendly jump we need to make our jump distance quite a bit longer than the actual gap we want to clear – using our previous example, something in the neighborhood of 500 units is safer. The exact value you want will depend on your game’s FOV, your player’s eye height and your valid pitch range (i.e. how far up or down you expect the player to be looking.)
There are other factors to consider as well: the speed of your player; the minimum reaction time of a typical gamer; the size (in units) and type (axial-aligned bounding box, capsule, etc.) of the player’s collision. However, these have a much smaller overall effect on the end result.
Of course, this information leads to another metric: our un-jumpable gap size. Since advanced players will learn to wait out the blind spot (rather than jumping immediately) we’ll need to make sure those gaps are at least 512 units away. Longer is better, where possible, since it will be visually clear to the player which gaps he can jump and which ones he can’t. You can also use this data to create more difficult jumps with less padding; however, this can easily create confusion among your more casual players.