Untitled

문제점 : 벽 오브젝트와 충돌 시 벽이 존재하는 방향으로 입력을 지속하면 플레이어 오브젝트가 벽 오브젝트와 붙어 중력의 영향을 받지 않고 붙어버리는 현상이 발생.

단순히 ray를 이용해 벽이 감지되면 friction항목을 0으로 만들고 감지되지 않으면 원래 값으로 복구할 생각이었으나 friction항목은 Physics material 파일을 따로 생성후 collider inspector에 삽입하는 방식이라 직접적인 접근이 불가했다.

[유니티 강좌] 2D RPG 게임 만들기 - 8 / 벽에 붙는 현상

이후 알아보니 Platform Effector 2D 컴포넌트를 이용해 측면 마찰을 비활성화 시킬 수 있는 방법을 적용해보았다.

but, 어째서인지 딱 달라붙던 오브젝트가 서서히 내려오는 정도로만 변화가 있을 뿐 마찰이 비활성화 되지 않았다.

수 번 시도해본 뒤 한가지 예상은 아래의 지면을 감지하는 함수때문이지 않을까 싶었다.

void GroundCheck(){
        isGround = Physics2D.OverlapCircle(checkPos.position, checkRadius, LayerMask.GetMask("groundMask"));
}

위 함수는 플레이어 오브젝트를 중심으로 원을 그린다.

void Move(){
        if(isSlope && isGround && !isJump){
            rigid.velocity = perp * moveSpeed * inputX * -1;
        }else if(!isSlope && isGround){
            rigid.velocity = new Vector2(inputX * moveSpeed, 0);
        }else if(!isGround){
            rigid.velocity = new Vector2(inputX * moveSpeed, rigid.velocity.y);
        }
        Jump();
        
        rigid.velocity = new Vector2(inputX * moveSpeed, rigid.velocity.y);
    }

그 뒤 Move함수에 의해 y값은 0으로 고정되기 때문이 아닌가 싶었다.

그래서 지면을 감지하는 방식을 Raycast로 변경했다.

void GroundCheck(){
        //isGround = Physics2D.OverlapCircle(checkPos.position, checkRadius, LayerMask.GetMask("groundMask"));
        RaycastHit2D isGroundBox = Physics2D.BoxCast(groundChckBoxCol.bounds.center, groundChckBoxCol.bounds.size, 0, Vector2.down, 0, LayerMask.GetMask("groundMask"));
        if(isGroundBox){
            Debug.Log(isGroundBox.collider.name);
            if(isGroundBox.collider.tag == "Land"){
                isGround = true;
            }
        }else{
            isGround =false;
        }
    }

위 코드와 같이 BoxCast를 사용했고 그 위치와 크기는 plyaer오브젝트 하위에 생성한 빈 오브젝트의 collider와 동일하게 했다.

이 BoxCast에 지면이 감지되면 isGround의 값은 true가 되고 반대의 경우 false로 변경된다.

Untitled

Untitled

오브젝트 하단의 초록색 박스가 groundCheckBox이며 해당 오브젝트는 collider 컴포넌트만을 갖고 있다.