[Unity] 사다리 타기2

조팽이·2024년 6월 8일

Unity

목록 보기
9/13

이전 포스트에서 사디리 타기 로직을 만들어보았다. 그런데 이런 말이 있었다. "그 collider를 꺼버리면 위에 있던 몬스터들 다 추락하겠네." OK. 그럼 collider를 끄지않는 다른 방식을 보여주겠다. 대부분의 로직은 동일하고 달라진 부분만 보여주겠다.

void DownLadding() {
        Vector3 newPos = new Vector3(transform.position.x, transform.position.y - 2*ladderCheck.bounds.extents.y, 0);
        RaycastHit2D hit = Physics2D.Raycast(newPos, Vector2.up * inputVec.y, 0.5f, LayerMask.GetMask("Ladder"));
        RaycastHit2D hit2 = Physics2D.Raycast(newPos, Vector2.up * inputVec.y, 0.5f, LayerMask.GetMask("Ground"));
        if (hit) {
            isLadder = true;
            Physics2D.IgnoreLayerCollision(LayerMask.NameToLayer("Player"), LayerMask.NameToLayer("Ground"), true);
            //hit2.collider.enabled = false;
            groundColl = hit2.collider;
            transform.position = new Vector2(hit.collider.transform.position.x, transform.position.y - ladderCheck.bounds.extents.y);
        }
    }

먼저 달라진 DownLadding이다. 달라진 부분은 중간에 IgnoreLayerCollision이란 부분인데, 뒤에 인자를 보면 LayerMask.NameToLayer라는 것이 있다. 이는 Layer의 이름을 index로 바꿔주는 함수이다. 마지막 인자가 true인데 이는 첫번째 두번째 layer에 해당하는 layer의 collider 상호작용을 무시하겠다는 뜻이다. 이렇게 구현하면 해당 Ground layer와 Player layer간의 collider 상호작용만 무시되어 몬스터가 ground 위에 서있을 수 있다.

void EndLadding() {
        //if(groundColl) groundColl.enabled = true;
        if (groundColl) groundColl = null;
        Physics2D.IgnoreLayerCollision(LayerMask.NameToLayer("Player"), LayerMask.NameToLayer("Ground"), false);
        isLadder = false;
        gravity = 1;
        anim.speed = 1f;
    }
    
    bool CheckGround() {
        RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.up * -1, 0.58f, LayerMask.GetMask("Ground"));
        if (hit && (hit.collider != groundColl)) {
            EndLadding();
            rb.velocity = Vector2.zero;
            return true;
        }
        return false;
    }

그 다음에 EndLadding이랑 CheckGround이다. EndLadding에서 달라진 점은 groundColl이 존재했다면 그것을 null로 바꿔주는 것이고 그 밑에 IgnoreLayerCollision함수를 통해 player와 ground의 collider의 상호작용을 다시 켰다. (내 유니티 2번 포스팅을 보면 관련 내용이 있다.)즉 ladding이 끝났으면 다시 player가 ground위에 서있을 수 있게 된다.
CheckGround함수이다. 이 함수는 사다리를 내려가다가 밑에 ground가 있는지 확인하는 함수였다. 이 때 내려올 때 받아 놓았던 groundColl과 hit.collider가 다른지 확인하는 로직으로 변경하였다. 이제 사다리를 타고 내려가자마자 hit.collider와 groundColl이 같기 때문에 바로 팅겨져 나오지 않고 잘 내려가게 되며, 사다리를 쭉 타고 내려와 ground와 만났을 때도 정상적으로 땅에 착지할 수 있다.

이전 포스트의 코드는 Enemy가 없다고 전제한 코드였고 이번에 작성한 코드는 Enemy가 있다고 전제한 코드이다. 이번에 작성한 코드가 이전 포스트의 로직까지 포함하지만, 성능적인 측면에서 차이가 날 수 있으므로 프로젝트에 맞게 잘 선택하면 좋을 것이다.

profile
게임개발자

0개의 댓글