Getting Character Scale Right Across a Whole Game

Scale is a web of relationships, not a number. Pick one reference height, express everything as a ratio to it, and catch the drift before it ships.

A stout blacksmith, a young armorer in a blue tunic and a knight in plate armor stand side by side on one floor line in an armory. Art made in Makko.

Your character stands next to a chair you commissioned last month. Both are good. Together they look like a toy on a model set, and you cannot say which one is wrong.

That is a scale failure, the defect players notice hardest while naming it least. Nobody says "the doorway is 1.6 times character height." They say the game looks cheap. Scale gets judged by eye, late, and by then the wrong asset is whichever you can afford to redo.

Scale is arithmetic, not taste, so it is fixable in advance. This piece makes it a contract: one anchor number, ratios to it, and a check that catches drift.

The short version. Pick one reference character, usually the player, and lock its height. Every other scale fact becomes a ratio to that height: doorways, steps, furniture, camera framing, tile grid, every other character. Decide the camera ratio first, since how much of the screen the character occupies fixes the display height everything else inherits. Then check assets against the ratios instead of against each other.

Scale is a web of relationships, not a single number

Teams treat scale as one value: pixels per meter, or character height in tiles. One number is never enough, because scale is only visible as a comparison between two things on screen at once. Five pairings, each able to be right while the others are wrong:

  • Character to character. Cast members against each other, enemies and bosses included.
  • Character to environment. Doorways, steps, platforms, furniture. Read as a real place or a dollhouse.
  • Character to camera. What fraction of the screen the character occupies.
  • Character to grid. Where the collision box sits against tile boundaries.
  • Character to interface. Health bars, damage numbers and prompts share the frame at the same distance.

Getting one pairing right is easy, and it is all anyone does. Scaling a prop until it sits right beside the character silently changes it against the grid and every other prop. The web fails, because nobody wrote it down.

Scale is a web, not a numberPlate 01
EVERY EDGE IS CHARACTER TO SOMETHING, AND CARRIES A RATIO TO H ANOTHER CHARACTER THE CAMERA A DOORWAY A PLATFORM STEP THE TILE GRID BOSS AT 3.0 H DECIDE THIS FIRST WIDTH 0.45 TO 0.6 H NO JUMP NEEDED COLLISION, NOT ART H 560 PX LOCKED 3.0 H 0.08-0.15 1.15-1.35 0.08-0.12 UNDER 1 TILE TUNE ONE PAIRING ALONE AND THE OTHERS MOVE WITH IT ON RATIO RIGHT BESIDE THE CHARACTER OFF RULE NOW OFF THE TILE BOUNDARY OFF CLASS NOW WRONG AGAINST PROPS
Getting one pairing right is easy, and it is all anyone does. The web fails because nobody wrote it down.
In one measured Makko cast of six, canvas height is locked at 560 px on every character while width floats between 295 and 311 px, set by build and pose. Each edge here is checkable by someone who cannot draw, since "is this doorway 1.3 H" is a measurement and "does it look right" is an argument. Scaling a prop until it sits right beside the character silently changes it against the grid and every other prop. Every element in a class takes the same ratio, so a second number means a second class.

Pick one reference height and express everything else as a ratio to it

Choose one character as the anchor, usually the player, since it is on screen constantly and every object gets compared against it. Lock its height and call it H. Every scale fact is now a multiple of H, and no asset gets compared to a neighbor.

Production output shows what locking looks like. In one measured Makko cast, a crew of six, canvas height is locked at 560 px on every character while width floats between 295 and 311 px, set by build and pose. The pattern repeats in that character's animation sheets: cell height holds at 260 px while cell width runs 119 to 221, set by the action's lateral reach.

A locked reference height buys three things:

  1. A stable ground line. Feet land on the same pixel row in every file, so characters share a floor with no per-asset offsets.
  2. One conversion constant. Display height divided by H converts any source dimension into shipped pixels. Nothing else in the contract is stated in pixels, so a resolution change moves H and leaves every relationship intact.
  3. Checkability by someone who cannot draw. "Is this doorway 1.3 H" is a measurement. "Does it look right" is an argument.

Width is deliberately not locked: lock the dimension your game measures by, and let the other follow the art.

Character to camera comes first, because it constrains the rest

The camera pairing gets skipped, and it constrains the other four. How much of the screen the character occupies is a gameplay decision with an art bill. Start from reaction time. A large fraction of screen height means a small visible world, less warning at the character's move speed, and combat that must be slower or more telegraphed. A small fraction means more warning, faster movement, and facial detail that stops reading. Rough bands: 8 to 15 percent for platformers and top-down action, 4 to 8 percent for tactics views where the unit is a token read by silhouette, 25 to 40 percent where faces carry information.

Then do the arithmetic, because it decides the pipeline. At 10 percent of a 1080 px screen the character ships 108 px tall. Against a 560 px source canvas that is a display scale of 0.193. Painted art tolerates that fraction. Pixel art does not, since a non-integer scale destroys single-pixel outlines, so it gets authored at display size instead. Settle the ratio first, and keep it in your Godot production spec too.

Character to environment: the ratios that read as a room

Two failure modes, opposites. The dollhouse: doorways and furniture too small, everything a play set. The cathedral: ceilings too generous, the character dwarfed. Architecture is proportioned to bodies, so correct ratios cluster tightly.

ElementRatio to HWhy it lands there
Doorway height1.15 to 1.35Clearance plus headgear. Below 1.1 the character ducks, above 1.5 it reads as a hall.
Doorway width0.45 to 0.6Shoulders plus passage. Wider reads as an archway.
Ceiling height1.4 to 1.8The strongest cue for interior against monumental space.
Step rise0.08 to 0.12Cleared without jumping. Also your controller's step-up value.
Table surface0.4 to 0.45Above the hip, below the waist. Props on it inherit that height.
Chair seat0.25 to 0.28Knee height. Most often wrong, since it gets drawn from memory.

Against a 560 px reference, a 1.25 H doorway is 700 px in source units and a 0.1 H step is 56 px. Run that multiplication once per element and put the results in the brief you hand to whoever makes the art, so props arrive at scale.

Two rules matter more than the exact bands. Every element in a class takes the same ratio, so a second number means a second class. And a prop breaking a ratio must break it far enough to read as intentional: a throne at 1.1 times a normal chair is an error, at 1.8 it is a throne.

What the character owes the grid once the grid exists

Tile size is derived from character height, not the reverse, and our piece on tile size and the level grid works that derivation through. This runs the other way: once the grid is locked, the character owes it five things, and later characters inherit them.

  • The collision box, not the art box, is what the grid measures. The art box includes hair, a hat, a weapon and transparent margin. Collision is a rectangle you declare in tile units.
  • The ground line sits on a tile boundary at display scale. Not near one. On it. Feet floating a fraction of a tile make every platform look slightly wrong and no asset look wrong.
  • Collision width stays under the narrowest authored gap. A one-tile gap entered at 0.95 tiles wide feels loose; at 1.05 it feels broken.
  • New characters inherit the display height, not a fresh derivation. A boss at three times the player is 3.0 H, a whole number of tiles.
  • Vertical tuning constants are ratios too. Step-up, maximum jump and ledge-grab reach get stated as multiples of H before pixels, since they are retuned whenever the camera moves.

Stylized scale breaks the ratios on purpose, and has to break them everywhere

Chibi and heroic proportions deliberately violate human ratios, and both are valid. The failure is not the break. It is breaking it on the characters and leaving the environment at real-world ratios, which is what most stylized 2D games ship.

A chibi character might stand three heads tall against a realistic seven or eight. Put it in a room proportioned to real bodies and one of two things happens. Keep total height at H and it reads as an adult with a balloon head. Shrink it and you get a child in an adult house, a bug rather than a style.

  1. Pick the measuring unit. Total height H is usual. In heavily stylized casts the body unit, ground to chin excluding the enlarged head, works better, being the part that touches the world.
  2. Re-derive the environment ratios against that unit once. A doorway at 1.25 body units gets shorter and wider, and the room reads as built for these people.
  3. Exaggerate prop shapes, not only sizes. A chibi cast beside thin, correctly proportioned furniture fails even when the heights are right.
  4. Apply it to every character. One realistically proportioned enemy destroys the convention.

Heroic proportions fail the same way reversed: elongate the cast, leave doorways at real ratios, and the world reads as cramped. Stylization is a transform on the whole web, not a character-only choice.

Side view and top-down do not measure the same thing

In a side view the vertical axis is height and nothing else, so every ratio above is checkable with a ruler. One addition: a parallax layer needs its own entry, since a distant building is not the near one at lower opacity, it is the near one at a smaller ratio to H.

Top-down is harder, because the vertical axis carries height and depth at once. A three-quarter character is drawn taller than its footprint, and the ratio of drawn height to footprint depth is the projection. That ratio must be identical for every object, or a table looks like it leans toward the camera. So a top-down contract carries two numbers per object where a side view carries one: footprint in tiles for collision, and drawn height as a ratio to H for the art. Pure overhead has no drawn height at all.

Scale drifts over months, and one composite catches it

Scale errors do not arrive as decisions. They accumulate. A prop from month one gets compared to a character revised in month three. An asset arrives at a different canvas and gets resized to fit rather than to the contract. A room looked empty, so its furniture went up ten percent and stayed. Most often, placeholders were sized by feel and the real art matched the placeholders instead of the ratios, and the piece on swapping placeholder art for real art covers the swap order that limits the damage.

The check is one image, built once and rebuilt monthly.

  1. Place the reference character at display scale on one ground line.
  2. Beside it, one of every environment class, plus every other cast member and enemy, at display scale.
  3. Overlay horizontal rules at the contract ratios: 0.25 H, 0.5 H, 1.0 H, 1.25 H.
  4. Anything missing its rule is out of contract. Fix the asset, not the rule.

Set a tolerance and enforce it. Production consistency is tighter than most teams assume: across six baked sheets from one character, the gap from the bottom of the art to the bottom of the cell ran 2 to 7 px, a five pixel band inside a 260 px cell height, under two percent. That band keeps a ground line stable between animations and works as a scale tolerance too. Record each asset's ratio where a script can read it, alongside the rules in your written sheet spec. A CSV of asset, class and ratio turns the eye check into a diff.

Drift over months, and the catchPlate 02
THE SAME PROP, MEASURED AGAINST THE SAME REFERENCE, FIVE TIMES OUT OF CONTRACT +10% CONTRACT TOLERANCE +/- 2% MONTH 1MONTH 2MONTH 3 MONTH 4MONTH 5 AUTHORED TOTHE CONTRACT NEW CANVAS,RESIZED TO FIT MATCHED AREVISED FIGURE ROOM LOOKEDEMPTY, UP TENPERCENT REAL ART METPLACEHOLDERS,NOT RATIOS THE COMPOSITE CHECK, REBUILT MONTHLY DEVIATION FROM THE STATED RATIO REFERENCE FIGURE 1.00 H DOORWAY 1.25 H CHAIR 0.25 H COVER 0.50 H, MONTH FOUR TEN PERCENT OVER TOLERANCE BAND +/- 2% +10%
Anything missing its rule is out of contract. Fix the asset, not the rule.
Scale errors do not arrive as decisions, they accumulate. A prop from month one gets compared to a character revised in month three, an asset arrives at a different canvas and gets resized to fit, and a room that looked empty had its furniture raised ten percent and kept it. Set the tolerance at plus or minus 2 percent of the stated ratio, rebuild the sheet monthly, and record each asset's ratio where a script can read it. Production holds tighter than most teams assume: across six baked sheets from one character, the gap from the bottom of the art to the bottom of the cell ran 2 to 7 px inside a 260 px cell height.

The scale contract, in one block

Copy this into the front of your art bible. Everything is a ratio to H, so it survives a camera change.

# [GAME] - Scale Contract v1.0   LOCK BEFORE ANY PROP EXISTS

ANCHOR
reference character : [name] (most screen time)
H = canvas height   : [__] px   LOCKED
canvas width        : [__] to [__] px, floats
ground-line gap     : [__] px, tol +/- [__]

CAMERA (decide first, all else inherits)
character / screen height : [0.__] of 1080
display height [__] px      display scale [0.___]
pixel-art safe : only if integer or 1/integer

CAST (ratios to H)
player [1.00]  npc [0.__]  enemy [0.__]  boss [_.__]

ENVIRONMENT (ratios to H)
doorway h [1.__]  doorway w [0.__]  ceiling [1.__]
step rise [0.__]  table [0.__]  chair [0.__]
cover [0.__]      platform depth [0.__]

GRID (derived elsewhere, restated)
tile [__] px   character [__] tiles   box [__]x[__]
ground line ON tile boundary, no fractional offset
step-up [0.__] H   max jump [_.__] H

STYLIZATION (blank if realistic)
unit : total height / body unit     heads [__]
env ratios re-derived against unit : yes / no

VIEW
projection : side / three-quarter / overhead
drawn height : footprint depth = [_.__], all objects
parallax : near [1.0] mid [0.__] far [0.__] of H

CHECK
tolerance +/- 2% of stated ratio
scale sheet rebuilt monthly and per new asset class
manifest : asset, class, ratio, pass/fail

Fill the camera block first. Every line under it depends on that ratio, and a camera decision made in month four invalidates the rest. When we produce a collection, reference height and display scale are set-wide inputs, not per-asset outcomes.

Frequently asked questions

My game already has hundreds of assets at inconsistent scales. Now what?

Build the scale sheet, then sort assets by screen time rather than by how wrong they are. Write the contract from the assets already right and most visible, so the bulk of your library validates instead of needing rework. Fix the high-visibility offenders and leave a rarely seen prop five percent off. Rewriting the contract around your worst assets is the trap.

Should the reference character be the player or an average adult NPC?

The player, almost always, since it is on screen every frame. Use an average adult NPC when the player character is deliberately unusual in size, a child protagonist or a large creature: anchoring to an outlier makes every ratio above read oddly and forces a full re-derivation.

Does the interface need to follow the scale contract?

Elements anchored in the world do: damage numbers, name plates, prompts and targeting rings sit at a ratio to H or they read as a different game layered on top. Screen-anchored elements such as the health bar follow screen ratios instead. Mixing the two is why a bar over an enemy can look correct in one room and absurd in another.

What if my camera zooms during gameplay?

Record the character-to-screen ratio at each zoom stop, not just the default, and author art for the tightest stop, since detail that holds there holds everywhere else and the reverse is not true. Tune the environment ratios against the stop the player sits in most.