티스토리 뷰

핵심 기능

is Trigger, Collider, Rigidbody


사진을 보시면 제가 간단히 공중에 떠있는 발판을 만들어놨습니다.

물론 플레이어 게임 오브젝트가 올라갈 수 있습니다. 이 부분에 대해서는 블로그 글을 꾸준히 읽으신 분은 충분히 할 수 있다고 생각합니다. 

그런데 문제가 있습니다. 보통 2D 게임에서 발판 밑에서 점프를 하면 캐릭터가 발판을 통과한다음 발판위로 착지를 합니다. 그런데 현재 우리가 알고있는 지식으로는 통과할 수가 없죠.

어떤 작용들이 거쳐야 캐릭터가 점프했을 때 발판을 통과한 다음 발판위에 착지할 수 있는지 알아보겠습니다.

우선 캐릭터가 점프 했을 시 발판을 감지하고 통과해야 합니다.

통과된 이후에는 다시 발판과 충돌처리가 되어 위에 서 있어야 합니다.

저 초록색 부분은 콜라이더(Collider)입니다. 잘 보이게 하기위해 크기를 약간 키워놨습니다.

두 GameObject의 충돌처리를 하기 위해선 모두 콜라이더를 가지고 있어야 하고 둘 중 하나는 Rigidbody를 가지고 있어야 합니다.

또 필요한 충돌 컴포넌트는 트리거(Trigger)입니다. 트리거는 GameObject간에 물리적 연산을 하지 않고 충돌을 감지할 수 있습니다. 즉, 두 GameObject가 접촉했을 때 서로 튕겨 나가지않고 통과하게 됩니다.

정리를 하자면, 통과할때는 트리거 작용이 되야하고 위에 서 있을 때는 콜라이더 작용이 되야합니다.

통과하고자 하는 캐릭터 이마(?)부분에 박스 콜라이더로 작게 추가하였고, 박스 콜라이더는 Is Trigger를 True로 설정해주었습니다.

이렇게 한 이유는, Circle Collider 2D가 이미 추가되어 있으니 Circle Collider 2D에 Is Trigger를 체크하면 그대로 바닥을 통과해 떨어져버립니다. 그러므로 Box Collider 2D를 이마에 추가해서 Is Trigger를 체크한 겁니다.

OnTriggerEnter2D 함수는 충돌이 시작되는 순간 호출되는 함수입니다. 함수 안에 사용한 코드는

GetComponent<CircleCollider2D>().isTrigger = true;

  • 출동이 시작되면 Circle Collider 2D의 is Trigger을 체크(true)해줍니다.

유니티를 실행해보면 박스는 통과하지만 통과한 후 Circle Collider 2D의 is Trigger가 계속 체크(true)되어 있으면서 계속 통과되어 나락으로 떨어지는 모습이 보입니다.

OnTriggerExit2D는 충돌이 끝날 때 호출되는 함수입니다. 함수안에 사용한 코드는

GetComponent<CircleCollider2D>().isTrigger = false;

  • 충돌이 끝나면 Circle Collider 2D의 is Trigger의 체크(true)를 풀어줍니다(false).

Circle Collider 2D의 is Trigger가 정상적으로 해제되는 걸 볼 수 있습니다.

정확히 말하면 캐릭터와 발판 작용을 하는 게임오브젝트 끼리 충돌작용을 어떻게 제어하냐에 관한 문제였습니다. 감사합니다.

댓글