오늘은 사다리 타기 로직을 구현해봤다.
체크해야할 것도 많고, 올라가는 것 뿐 아니라 다시 내려오는것까지 구현해야해서
뭔가 은근 까다로웠다.
다음은 결과물이다.
메이플 스토리 사다리 타는것 기준으로 구현했는데 뭔가 느낌이 괜찮은 것 같다.
일단 사다리 로직을 구현할 때 내가 가장 먼저 생각해야하는 조건이
사다리가 옆에 있는가??
였다.
그래서 이런식으로 Near 사다리 조건을 체크해줬다.
사다리에 Ladder 스크립트를 넣어서 어떤 사다리를 타고 있는지도 가져와줬다. (나중에 필요할 것 같아서)
private void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.name == "ladder")
{
isNearLadder = true;
ladder = other.GetComponent<Ladder>();
}
}
private void OnTriggerExit2D(Collider2D other)
{
if (other.gameObject.name == "ladder")
{
isNearLadder = false;
ladder = null;
}
}
그리고 생각해보니, 사다리 탈때는 중력을 없애야겠다고 생각했다.
그래서 update 문에서 Near사다리 이면 중력을 없애버렸다.
void Update()
{
// gravity setting
if (isNearLadder)
rb.gravityScale = 0;
else
rb.gravityScale = gravityScale;
}
Climbing 중일 때, 좌우 이동을 막기 위해 Climbing 조건을 정의해봤다.
Climbing 이 시작될때
- Near Ladder true
- horizontal 입력 true
Climbing 상태가 끝나는 조건
- IsClimbing true
- isGrounded true (항상 위든 아래든 땅에 닿아야 클라이밍이 끝난다.)
void Update()
{
// judge climbing
if (isNearLadder && vertical != 0)
isClimbing = true;
else if (isClimbing && isGrounded)
isClimbing = false;
}
ground 체크는 상용화 된 방법을 사용했다.
Player 바닥 밑에 EmptyObject를 깔아주고 Physics2D.OverlapCircle을 통해 체크해준다.

private void FixedUpdate()
{
// judge isGrounded
isGrounded = Physics2D.OverlapCircle
(groundCheck.position, groundRadius, groundLayer);
}
GroundCheck는 물리 상태이기 때문에, FixedUpdate에서 하는게 가장 안전하다.
초록 부분 - Ground
갈색 부분 - Ladder
맵 특징 1
사다리 부분은 ground가 끊겨있다.
사다리 부분의 Ground는 isTrigger 조건만 넣어서 Player가 막힘없이 통과할 수 있도록 하였다.
처음에는 사다리 부분의 ground가 없었는데, 있어야 다 올라갔다는 체크를 해줄 수 있어서 추가하였다.
맵 특징2 - 사다리 2d collider
윗부분을 길게 뽑아서 윗층에서 돌아다닐때도 Player가 사다리랑 Trigger를 감지할 수 있도록 하였다.
또한, 어느 정도 사다리 중앙에 와서 위아래 입력을 해야 사다리를 이용할 수 있도록, 콜라이더의 좌우 폭을 줄여주었다.

맵 특징3
사다리 양 옆 초록 ground의 collider는 조금 줄여준다.
딱맞게 콜라이더를 설정해버리면 플레이어가 끼어서 내려갈 수가 없기 때문에 콜라이더를 조금 줄여준다.
이제 Climb 상태에 따라,
Climbing 일때는 좌우 이동을 막고, x position을 사다리 중앙으로 고정시켜 줬다.
Climbing 중이 아닐 때는 좌우 입력을 반영시켜주었다.
private void FixedUpdate()
{
// Player Move (Climb / not Climb)
if (isClimbing)
{
float newX = ladder.transform.position.x;
float newY
= Mathf.Clamp
(rb.position.y + vertical * climbSpeed * Time.fixedDeltaTime,
ladder.bottom.position.y, ladder.top.position.y);
rb.MovePosition(new Vector2(newX, newY));
}
else
{
rb.linearVelocity
= new Vector2(horizontal * moveSpeed, rb.linearVelocity.y);
}
}
Climb 상한/하한 위치 설정
코드 중간에 Mathf.Clamp를 넣어, 위 아래 포지션의 상한, 하한선을 제한시켜준 이유는
저 코드를 넣지 않았더니 플레이어가 사다리에 도착했을 때 심하게 진동을하고 상태가 꼬여버려서
안전하게 사다리 top, bottom 위치까지만 움직이도록 제한해주었다.
다음은 점프를 추가해볼 것이다!
| 벡터 내적 활용 : 몬스터가 캐릭터 시야에 있는지 확인하기(Field of View) (0) | 2026.01.03 |
|---|---|
| [2D-Platformer] 3. 점프 구현하기 (Jump) (0) | 2025.12.27 |
| [2D Platformer] 1. START & 좌우 이동 구현 (0) | 2025.12.22 |
| 유니티에서 Oculus Meta Quest3 빌드하기 (1) | 2024.02.14 |
| 유니티 2D게임 만드는중ㅋㅋ (1) | 2024.02.11 |