A Movement Profile describes what one kind of character can do. Create one with Assets > Create > GTNav 2D > Movement Profile.
Profiles are measured in cells, so the same profile works with any Tilemap cell size.
NavGraph2D bakes the profiles in its Profiles list when the scene starts. A profile used by an agent but not listed is baked the first time it is needed.NavAgent2D reads its profile, sets the Rigidbody2D gravity scale to match, and executes the baked links.profile.NotifyChanged() afterwards.| Setting | Default | Meaning |
|---|---|---|
| Move Speed | 6 | Walking speed in cells per second. |
| Jump Height | 3 | Height of the highest ledge the agent can jump onto, in cells. |
| Time To Apex | 0.4 | Seconds from takeoff to the top of a full jump. Smaller values feel snappier and use stronger gravity. |
| Max Jump Distance | 5 | Longest horizontal distance of a jump or fall, in cells. |
| Air Speed Multiplier | 1 | Maximum horizontal speed in the air, as a multiple of Move Speed. |
| Max Fall Height | 10 | Highest drop the agent will take, in cells. |
| Width / Height | 0.8 / 1.8 | Body size in cells. It should match the collider. |
| Can Climb Ladders | on | If on, the agent climbs ladders on the graph’s Ladder Tilemap. |
| Climb Speed | 3 | Climbing speed in cells per second. |
| Use One Way Platforms | on | If on, the agent jumps up through and drops down through one-way platforms. If off, it treats them as solid. |
| Jump Penalty | 0.2 | Extra search cost per jump, in seconds. Raise it to make agents prefer walking. |
The profile Inspector also shows the derived values: gravity, Rigidbody2D gravity scale, jump velocity and apex height.
You set what the jump should achieve. The physics values are derived from that:
apex = Jump Height + 0.5 cells (LedgeClearance)
gravity = 2 * apex / TimeToApex²
jump speed: the launch speed that reaches the apex under fixed-timestep physics
The 0.5-cell clearance is there because a body cannot land on a ledge whose top it only just reaches: it must clear the ledge’s corner first. So “Jump Height 3” means “can land on a ledge 3 cells up”, and a full jump peaks about 3.5 cells high.
For every candidate jump, the baker simulates the flight one physics step at a time, using the same integration as Rigidbody2D and the current Time.fixedDeltaTime. It tries a few launch speeds, from the lowest arc that reaches the target up to a full jump. The first arc that passes all of these checks becomes the link:
If no plain arc fits an upward jump (the agent stands in a narrow pit, or a ledge or low ceiling is in the way), the baker also tries steered jumps: a jump that rises straight up for a while and only then moves sideways, like a player jumping out of a pit and steering onto the ledge above. Each launch speed is tried with the turn at six points of the rise, so short hops under a low ceiling work too.
Jumps of 3 cells or more that do not fit from cell center to cell center are tried again from the edge of the takeoff cell and onto the near side of the landing cell (0.3 cells off center), as a player would take a long jump.
The link stores the launch velocity, the step count and, for steered jumps, the step at which the sideways motion starts (SteerDelay). At runtime, NavAgent2D walks to the takeoff point and launches with exactly that velocity, so the agent flies the arc the baker checked.
Falls work the same way: the agent walks past the ledge and launches with zero vertical speed. Drop-throughs are the same again, except that the agent ignores one-way collisions until its whole body is below the platform it dropped through.
A jump is one launch, at most one turn (straight up, then sideways at a constant speed), and one landing. Some moves a skilled player can make need more air control than that, and agents do not plan them:
Agents take another route where one exists, or treat the spot as unreachable. If a level relies on such a move, widen the gap or the landing a little.
A node is usable by a profile only if enough cells above it are free for the body height. With Height 1.8, a profile needs 2 free cells. Narrow tunnels that are fine for a small enemy are skipped for a tall one.
Keep the collider the same size as the profile. The NavAgent2D Inspector warns if they differ and has a Match Collider To Profile button. Characters made with the GameObject menu are sized correctly.
| Enemy | Changes from the default |
|---|---|
| Heavy brute | Move Speed 4, Jump Height 1.5, Width 1.2, Height 2.4, Jump Penalty 1 |
| Agile hunter | Move Speed 8, Jump Height 5, Max Jump Distance 7, Time To Apex 0.35 |
| Small crawler | Width 0.6, Height 0.8, Jump Height 2 (fits through 1-cell tunnels) |
| Ground-bound walker | Use One Way Platforms off, Jump Height 1.2 (only small steps) |
Time.fixedDeltaTime. Trajectories are baked per physics step. If you change it at runtime, links are rebaked for the new timestep the next time they are used (a NavGraphData asset baked with another timestep is not used).Physics2D.gravity.y must not be zero. The agent sets its own gravity scale relative to it.