
Unity Physics Jitter Bug: Solving Teleportation and Jerky Movement
February 10, 2026
Unity Trigger Bug: OnTriggerStay Inconsistent Behavior (Causes and Reliable Fixes)
February 11, 2026Unity Player Cannot Go Up Stairs Smoothly (3D Character Controller): Causes and Fixes
A very common issue in Unity 3D projects is when the player cannot walk up stairs smoothly. Instead of moving naturally, the character may:
- Get stuck on each step
- Shake or jitter while climbing
- Slide backward
- Stop completely
- Require jumping to move up
This problem usually happens when using either a Rigidbody-based controller or Unity’s built-in CharacterController. In this guide, we will break down the real causes and show reliable solutions used in production games.
Why This Happens
Stairs are not smooth ramps. They are a series of small vertical ledges. From the physics engine’s perspective, each stair is a tiny wall. If your controller is not configured properly, Unity treats each step as an obstacle instead of something walkable.
Problem 1: Step Offset Is Too Low (CharacterController)
If you are using Unity’s CharacterController, the most common reason is incorrect Step Offset.
The Step Offset defines how high the controller can automatically climb.
If your stair height is 0.3 units but Step Offset is 0.2, the player will get stuck.
Fix:
- Select the CharacterController component
- Increase Step Offset slightly higher than your stair height
Example setup:
- Stair height: 0.3
- Step Offset: 0.35
Make sure Step Offset is not greater than the controller height.
Problem 2: Slope Limit Is Too Low
If the Slope Limit is too small, Unity may treat the stairs as too steep.
Fix:
- Increase Slope Limit to 45–60 degrees
Common safe value:
- Slope Limit: 45 or 50
Problem 3: Rigidbody Controller Hitting Step Colliders
If you use a Rigidbody-based controller and apply movement manually, each stair edge acts like a wall.
Bad movement example:
void Update() {
transform.position += moveDirection * speed * Time.deltaTime;
}
This ignores physics and causes collision snapping.
Correct approach:
void FixedUpdate() {
rb.MovePosition(rb.position + moveDirection * speed * Time.fixedDeltaTime);
}
Problem 4: Using a Capsule Collider Without Step Handling
A capsule collider does not automatically “step up” like CharacterController does. It needs help.
Professional solution: Detect steps using raycasts and gently lift the player.
Basic step detection example:
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit, 0.5f)) {
if (hit.collider.CompareTag("Stairs")) {
rb.position += new Vector3(0, stepSmooth * Time.fixedDeltaTime, 0);
}
}
This simulates stepping upward instead of colliding with a vertical face.
Problem 5: Stair Colliders Are Incorrect
Sometimes the issue is not the player. It is the stairs.
Bad practice:
- Each step has its own box collider
This creates multiple hard edges.
Better solution:
- Use a single ramp collider over the stairs
- Keep visible stairs as mesh only
This gives smooth movement while preserving visuals.
Problem 6: Skin Width Too Small (CharacterController)
If Skin Width is too low, the controller may stick to edges.
Recommended:
- Skin Width = 10% of Radius
Example:
- Radius: 0.5
- Skin Width: 0.05
Problem 7: Gravity Fighting Stair Movement
When gravity is applied every frame, the player may get pushed down while trying to move up small steps.
Common CharacterController movement pattern:
Vector3 move = transform.right * x + transform.forward * z;
if (controller.isGrounded && velocity.y < 0) {
velocity.y = -2f;
}
velocity.y += gravity * Time.deltaTime;
controller.Move(move * speed * Time.deltaTime);
controller.Move(velocity * Time.deltaTime);
If gravity is too strong, reduce it slightly or adjust grounded logic.
Best Professional Solutions
Solution 1: Use Invisible Ramp Colliders
This is the most stable and widely used method.
- Place a simple ramp collider over stairs
- Disable collision on individual steps
Solution 2: Proper CharacterController Settings
- Step Offset slightly higher than stair height
- Slope Limit 45–60
- Skin Width properly configured
Solution 3: Custom Step System (Advanced)
Advanced controllers use:
- Forward raycast to detect step
- Lower raycast to detect ground
- Smooth upward adjustment
This mimics how AAA character controllers work.
Debugging Checklist
- Is Step Offset high enough?
- Is Slope Limit too restrictive?
- Are stairs using proper colliders?
- Are you moving Rigidbody in FixedUpdate?
- Is gravity too aggressive?
- Is interpolation enabled?
Conclusion
If your Unity player cannot go up stairs smoothly, the issue is usually configuration, not a Unity bug. Stairs are treated as vertical obstacles unless your controller is properly configured.
The most reliable fix in production is using an invisible ramp collider combined with properly tuned CharacterController settings. For Rigidbody controllers, custom step detection logic is often necessary.
Once configured correctly, stair movement should feel smooth, stable, and natural.










