본문 바로가기

트러블 슈팅

트러블 슈팅 - ContactPoint2D contact

문제 발생

플랫포머로 쿠키런 형식의 러닝게임을 만들고 있었는데 바닥 타일의 Tag를 Ground로 설정하고 바닥판정을 주고자 하였고, 플랫폼을 다 설정 한 뒤 테스트를 진행하자, 아래와 같은 현상이 일어났다.

 

여기서 점프를 해서

 

 

몸 판정 부분이 땅의 윗쪽이 아닌 부분에 부딪혀도 땅을 밟았다는 판정이 떠서, 플랫폼의 옆에 부딪혀도 공중에서 점프를 시전 해버리는 괴이한 움직임을 보였다.

 


원인 발견

당연하게도 일단 부딫히면 땅으로 판정해 버리는 부분을 수정하는 것이 중요해 보였고, 이를 다른 방식으로 대체하고자 여러 방향성을 모색해 보았다.

 


 

해결

void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Ground"))
    {
        foreach (ContactPoint2D contact in collision.contacts)
        {
            // 법선 벡터(normal)가 위쪽(0, 1)에 가까운 경우에만 "땅"으로 인정
            if (contact.normal.y > 0.7f)
            {
                isOnGround = true;
                return;
            }
        }
    }
}

 

위와 같이 코드를 수정하여 contact한 부분의 방향을 통해 충돌 시점의 위치가 아래쪽이 될 때만 땅으로 인정되는 형식으로 코드를 수정하였고.

 

  • 완전히 위쪽(수직): contact.normal.y == 1.0f
  • 약간 기울어진 땅: contact.normal.y > 0.7f
  • 수직 벽: contact.normal.y == 0.0f
  • 천장(거꾸로 충돌): contact.normal.y < 0.0f

 

이와 같은 조건에 반응 하기에, 법선 벡터의 조건이 알맞을 경우, 정상적으로 작동하는것을 확인할 수 있었다.