유니티 오브젝트 충돌 처리 [유니티 C#]

게임에서 핵심이 되는 로직 중 하나는 충돌 로직입니다.

오늘은 충돌을 처리하는 2가지 방법에 대해서 알아보겠습니다!

  • OnCollision
  • OnTrigger

1. OnCollision vs OnTrigger

충돌은 크게 물리적 충돌과, 논리적 충돌로 나눌 수 있습니다.

어떤 충돌을 사용 하느냐에 따라 사용해야 되는 함수가 다릅니다.

  1. 물리적 충돌 (벽, 바닥 등에 충돌, 오브젝트 간 충돌 등) = OnCollision
  2. 논리적 충돌 (아이템 획득, 특정 구역 진입 등) = OnTrigger

충돌 이벤트를 발생 시키기 위한 조건은 다음과 같습니다.

  1. 충돌과 관련한 오브젝트가 모두 충돌체(Collider)를 가지고 있을 것
  2. 충돌한 오브젝트 중 최소 하나가 Rigidbody 컴포넌트를 가지고 있을 것

2. OnCollision

OnCollision함수는 물리적 충돌이 발생했을 때 사용하는 함수입니다.
두 물체의 ColliderisTrigger 변수가 false 상태인 상태에서 물리적 충돌이 일어나야 호출됩니다.

OnCollision 내에서도 충돌이 어떤 상태에서 발생 했는지에 따라 사용되는 함수가 다릅니다.

주요 함수
  • OnCollisionEnter : 오브젝트가 충돌한 순간 1회 호출
  • OnCollisionStay : 오브젝트가 닿아 있는 동안 계속 호출
  • OnCollisionExit : 오브젝트가 닿아 있다 떨어진 순간 1회 호출

C#
private void OnCollisionEnter(Collision collision)
{
    // Ground 태그에 닿았는 지 확인
    if (collision.gameObject.CompareTag("Ground"))
    {
        Debug.Log("땅에 닿음.");
    }
}

OnCollision함수 사용 시 ‘Collision’ 타입의 매개변수가 필요합니다.
해당 매개변수는 충돌한 대상의 데이터를 가져오는 역할을 합니다.

위 예제에서는 충돌한 대상 즉, 매개변수가 “Ground” 태그를 가지고 있는 지 확인하는 용도로 사용했습니다.

만약 2D 게임을 개발 중이시고, 충돌체와 Rigidbody가 2D 라면 ‘OnCollisionEnter2D’ 함수와 매개변수를 ‘Collision2D‘로 사용해주시면 됩니다.

앞으로 나올 OnTrigger와 Enter 외 Stay, Exit 모두 함수와 매개변수 뒤에 ‘2D‘를 붙여주시면 2D게임에서 사용하실 수 있는 충돌 이벤트 함수가 됩니다.

3. OnTrigger

OnTrigger함수는 논리적 충돌 즉, 트리거 구현에 사용 될 충돌에 사용되는 함수입니다.
두 물체 중 하나 이상의 Collider isTrigger 변수가 ‘true’여야 해당 함수가 호출될 수 있습니다.

OnCollision과 마찬가지로 조건에 따라 3가지의 함수가 사용됩니다.

주요 함수
  • OnTriggerEnter : 오브젝트가 겹친 순간 1회 호출
  • OnTriggerStay : 오브젝트가 겹쳐있는 동안 계속 호출
  • OnTriggerExit : 오브젝트가 겹쳐있다 떨어진 순간 1회 호출

C#
private void OnTriggerEnter(Collider other)
{
    // Item 태그를 가진 오브젝트와 겹칠 경우 처리
    if (other.CompareTag("Item"))
    {
        Debug.Log("아이템 획득");
        
        // 아이템 삭제
        Destroy(other.gameObject); 
    }
}

OnTrigger또한 매개변수를 통해 겹쳐진 오브젝트의 데이터를 받아올 수 있습니다.
다만, OnColiision과 다르게 ‘Collider’타입을 매개변수로 받습니다.

위 예제의 경우는 Item태그를 가진 오브젝트와 겹칠 시 로그를 출력하고 해당 오브젝트를 제거하는 로직입니다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다