I'm FanJae.

[20260522] Unity 정리 ( Collider 충돌 처리 기초 - Collision, Trigger ) 본문

Unity/Unity 초격차캠프

[20260522] Unity 정리 ( Collider 충돌 처리 기초 - Collision, Trigger )

FanJae 2026. 5. 22. 23:21

1. Collider란?

- 충돌 영역을 정의하는 Component다.

- 실제 모델 모양이 아니라 단순화된 형태를 주로 사용한다.

- Collider는 영역을 담당하고, Rigidbody는 물리 계산을 담당한다.


2. Collider가 관여하는 충돌 처리 방식

① Collision

- 실제 물리 충돌이 발생했을 때 호출된다.

- 벽에 막힘, 상자 밀기, 투사체 충돌 등에 사용한다.

 

(1) 주요 사용처

- 캐릭터가 벽에 부딪혀서 밀리는 현상

- 플레이어가 상자를 밀거나 물리적으로 상호 작용이 필요할 때

- 투사체가 적이나 벽에 맞아서 파괴될 때

 

(2) 조건

- 두 Object 모두 Collider가 필요하다.

- 두 Object 中 최소 하나는 Rigidbody가 필요하다.

- 두 Collider 모두 Is Trigger가 False여야 한다.

 

(3) 주요 메서드

- OnCollsionEnter : 처음 충돌이 발생했을 때 호출

- OnCollsionExit : 충돌이 끝났을 때 호출

- OnCollsionStay : 충돌이 유지되는 동안 매 프레임 호출


② Trigger

- 물리적인 충돌 없이 진입만 감지한다.

- 아이템 획득, NPC 대화 범위, 포탈, 체크포인트 등에 사용한다.

 

(1) 주요 사용처

- 아이템이 닿았을때 획득 처리

- NPC 대화 가능 범위를 감지한다.

- 특정 영역 진입 시 위치가 이동되게 할 때 사용한다.

 

(2) 조건

- 두 Object 모두 Collider가 필요하다.

- 두 Object 中 최소 하나는 Rigidbody가 필요하다.

- 둘 중 최소 하나의 Collider가 Is Trigger가 True여야 한다.

일반적으로는 감지 영역 역할을 하는 Collider를 True로 둔다. 예를들어, 아이템 획득이라면 아이템 Collider를 Trigger로 둔다.

 

(3) 주요 메서드

- OnTriggerEnter : 처음 Trigger 영역 안으러 들어옴

- OnTriggerExit : Trigger 영역 안에서 나감

- OnTriggerStay : Trigger 영역 안에 머무르는 상태


③ Collision과 Trigger의 차이

- Collision의 목적은 실제 충돌을 체크하기 위한 것이지만, Trigger는 물리적인 충돌이 아닌 진입만 감지한다.

- Collision을 사용할 때는 Is Trigger를 False로 지정해야 하지만, Trigger를 사용할 때는 Is Trigger를 True로 지정한다. (※ 생각보다 이 내용을 많이 실수한다고 하니까 유의해야 할 것 같다.)

- 벽, 상자, 투사체 충돌과 같은 물리적인 충돌에는 Collision을 사용하고, 포탈과 같은 특정 영역에 들어오는 범위 처리에는 Trigger를 사용해서 처리한다.


3. Tag를 이용한 충돌 대상 구분

- Tag는 GameObject를 구분하기 위한 이름표 역할을 한다.

- Collision이나 Trigger가 발생하면 충돌한 대상의 GameObject를 얻을 수 있다.

- 이때 CompareTag()를 사용하면 충돌한 오브젝트가 벽인지, 아이템인지, 적인지 구분할 수 있다.

 

3-1. Collision에서 Tag 사용

private void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("Wall"))
    {
        Debug.Log("벽과 충돌");
        Debug.Log($"{collision.gameObject.name}");
    }
}

- collision.gameObject 는 충돌한 상대 오브젝트를 의미한다.

- CompareTag(”Wall”)은 상대 오브젝트의 Tag가 “Wall”인지 확인한다.


3-2. Trigger에서 Tag 사용

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Item"))
    {
        Debug.Log("아이템 획득");
        Destroy(other.gameObject);
    }
}

- other 는 Trigger 영역에 들어온 상대 Collider를 의미한다.

- other.CompareTag(”Item”)으로 아이템인지 확인한다.

- 아이템 획득, 포탈 진입, 체크포인트 통과 같은 감지 처리에 사용한다.

 


3-3. 단순 tag 비교보다 CompareTag를 권장하는 이유

if (collision.gameObject.tag == "Wall")
{
}
if (collision.gameObject.CompareTag("Wall"))
{
}

- 두 방식 모두 사용이 가능하지만, gameObject.tag == "Wall" 방식은 tag 문자열을 가져와서 비교하는 방식이고, CompareTag() 는 지정된 태그를 비교하기 위한 전용 메서드이기 때문에, CompareTag()를 사용하는 것이 더 좋다.


4. TryGetComponent를 이용한 Component 접근

private void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("Wall"))
    {
        if (collision.gameObject.TryGetComponent<Renderer>(out Renderer renderer))
        {
            renderer.material.color = Color.red;
        }
    }
}

- TryGetComponent()는 대상 오브젝트에 특정 Component가 있는지 확인하면서 가져오는 방식이다.
- 충돌 처리에서는 상대 오브젝트가 어떤 Component를 가지고 있는지 확실하지 않을 수 있다.
- 이때, GetComponent()로 바로 가져와 사용하면, 해당 Component가 없을 경우 ‘null’이 반환되고, 이후 접근 과정에서 오류가 발생할 수 있다.
- 따라서, GetComponent()를 이용해 바로 가져오기 보다 TryGetComponent()를 사용하면 null 오류를 줄일 수 있다.


5. 정리

- Collider는 오브젝트의 충돌 영역을 정의하는 컴포넌트다.

- Collider를 이용한 충돌 처리는 실제 물리 충돌이 필요한 Collision과, 물리 반응 없이 영역 진입만 감지하는 Trigger로 나눌 수 있다.

- 충돌이나 Trigger가 발생한 뒤에는 Tag로 대상을 구분하고, 필요한 경우, TryGetComponent()를 이용해 해당 오브젝트의 컴포넌트를 안전하게 가져와 처리할 수 있다.

Comments