상세 컨텐츠

본문 제목

[2D Platformer] 2. 사다리 로직 구현 (Climbing Ladder)

개발기록/Unity 유니티

by 도리(Dory) 2025. 12. 26. 14:11

본문

오늘은 사다리 타기 로직을 구현해봤다.

 

체크해야할 것도 많고, 올라가는 것 뿐 아니라 다시 내려오는것까지 구현해야해서

뭔가 은근 까다로웠다.

 

다음은 결과물이다.

메이플 스토리 사다리 타는것 기준으로 구현했는데 뭔가 느낌이 괜찮은 것 같다.

 

사다리 로직 구현 결과물

 

 

 

1. 사다리가 옆에 있는지 체크

 

일단 사다리 로직을 구현할 때 내가 가장 먼저 생각해야하는 조건이

 

사다리가 옆에 있는가??

 

였다.

 

그래서 이런식으로 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;
    }

 

 

 

2. Climbing 상태 체크

 

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;
    }

 

 

 

 

3. IsGrounded 체크

ground 체크는 상용화 된 방법을 사용했다.

Player 바닥 밑에 EmptyObject를 깔아주고 Physics2D.OverlapCircle을 통해 체크해준다.

 

 

 

    private void FixedUpdate()
    {
        // judge isGrounded
        isGrounded = Physics2D.OverlapCircle
			(groundCheck.position, groundRadius, groundLayer);
    }

 

GroundCheck는 물리 상태이기 때문에, FixedUpdate에서 하는게 가장 안전하다.

 

 

4. 맵 조정

초록 부분 - Ground

갈색 부분 - Ladder

 

맵 특징 1

사다리 부분은 ground가 끊겨있다.

사다리 부분의 Ground는 isTrigger 조건만 넣어서 Player가 막힘없이 통과할 수 있도록 하였다.

처음에는 사다리 부분의 ground가 없었는데, 있어야 다 올라갔다는 체크를 해줄 수 있어서 추가하였다.

 

맵 특징2 - 사다리 2d collider

윗부분을 길게 뽑아서 윗층에서 돌아다닐때도 Player가 사다리랑 Trigger를 감지할 수 있도록 하였다.

또한, 어느 정도 사다리 중앙에 와서 위아래 입력을 해야 사다리를 이용할 수 있도록, 콜라이더의 좌우 폭을 줄여주었다.

맵 2d Collider

 

맵 특징3

사다리 양 옆 초록 ground의 collider는 조금 줄여준다.

딱맞게 콜라이더를 설정해버리면 플레이어가 끼어서 내려갈 수가 없기 때문에 콜라이더를 조금 줄여준다.

 

5. 이동 로직

 

이제 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 위치까지만 움직이도록 제한해주었다.

 

 

 

다음은 점프를 추가해볼 것이다!

관련글 더보기