Hey all, in this dev-log, we are creating a simple ladder system in Unity. This dev-log is an extension of the Udemy course “Parkour and Climbing System in Unity.” And of course, who wouldn’t want a ladder system in their parkour game?
Let’s get started
Requirements
- This blog is based on the latest project file provided in the Udemy course. You can download it from the resources.

- Next, we need these three ladder animations from Mixamo.



Now we can start to create the ladder system. First, open the project and create a ladder in your scene. Here’s how i created it.
Create the ladder sides with two cylinders.

Then we create a ladder step using climb ledge prefab. Make multiple copies using Ctrl + D shortcut.

Now, we need to make the ladder steps evenly spaced. How do we do that? Unity has a feature called Numeric field expressions.
We can use the linear ramp expression L(0,4) to space the ladder steps evenly.

Now we need to connect these ledges to each other and mark the mount point. So that we can climb this ladder. Just connect these to the next ledge and make sure all connection types are set to move. That’s it.

Now it will look like this

We can create a ladder tag to identify it as a ladder. Set ladder tag to all climbing ledges.

Currently, there is no way to identify the bottom of the ladder. For the top, we can define it using the mount point from the inspector. So, we can create another tag just to specify the bottom ladder step. We can name it “Ladder Start”.
Set the bottom step of the ladder to ladder start.

Note: I set up the third ladder to be the starting ladder. This is because if we set the bottom one, the player will go through the floor. Therefore, the last two ladder steps are set to the default layer.
Now, open your animation controller and add all three animations to it.
The “Start Climbing Ladder” animation is too long and it begins with a strange rotation animation. Therefore, we need to trim it down to make it usable.
We also need two more animations: one for climbing down and another for stepping down from the ladder.
Luckily, we can make use of the animator speed parameter to reverse the animations. Set it to -1.


Now, let’s get to the coding part. It’s pretty easy to implement because we just need to change the animation if it has a ladder tag.
First, let’s change the jump animation.
climbController.cs line 20:
if (Input.GetButton("Jump") && !playerController.InAction)
{
if (envScanner.ClimbLedgeCheck(transform.forward, out RaycastHit ledgeHit))
{
currentPoint = GetNearestClimbPoint(ledgeHit.transform, ledgeHit.point);
playerController.SetControl(false);
if (currentPoint.CompareTag("Ladder") || currentPoint.CompareTag("Ladder Start"))
{
StartCoroutine(JumpToLedge("Start Climbing Ladder", currentPoint.transform, 0f, 0.5f, handOffset: new Vector3(0.1f, 0.2f, 0.1f)));
return;
}
StartCoroutine(JumpToLedge("IdleToHang", currentPoint.transform, 0.41f, 0.54f));
}
}
Then change the shimmy animation for ladders.
climbController.cs line 91:
else if (neighbour.connectionType == ConnectionType.Move)
{
currentPoint = neighbour.point;
if (currentPoint.CompareTag("Ladder"))
{
if (neighbour.direction.y == 1)
StartCoroutine(JumpToLedge("Climbing Ladder", currentPoint.transform, 0f, 1f, handOffset: new Vector3(0.05f, 0f, 0.1f)));
else if (neighbour.direction.y == -1)
StartCoroutine(JumpToLedge("Climbing Ladder reverse", currentPoint.transform, 0f, 1f, handOffset: new Vector3(0.05f, 0f, 0.1f)));
return;
}
else if (currentPoint.CompareTag("Ladder Start") && neighbour.direction.y == -1)
{
StartCoroutine(MountFromHang("Stop Climbing Ladder"));
return;
}
if (neighbour.direction.x == 1)
StartCoroutine(JumpToLedge("ShimmyRight", currentPoint.transform, 0f, 0.38f, handOffset: new Vector3(0.25f, 0.05f, 0.1f)));
else if (neighbour.direction.x == -1)
StartCoroutine(JumpToLedge("ShimmyLeft", currentPoint.transform, 0f, 0.38f, AvatarTarget.LeftHand, handOffset: new Vector3(0.25f, 0.05f, 0.1f)));
}
}
And there you go. We just created a simple ladder system. Hope this small dev-log was helpful for you.

