| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 독서
- Unity
- multi-thread
- c#
- git
- BOJ
- System Programming
- Toy Project
- Data Structure
- Network Programming
- C++
- Online Judge
- PS
- Today
- Total
I'm FanJae.
[20260522] Unity 정리 ( Collider 충돌 처리 기초 - Collision, Trigger ) 본문
[20260522] Unity 정리 ( Collider 충돌 처리 기초 - Collision, Trigger )
FanJae 2026. 5. 22. 23:211. 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()를 이용해 해당 오브젝트의 컴포넌트를 안전하게 가져와 처리할 수 있다.
'Unity > Unity 초격차캠프' 카테고리의 다른 글
| [20260526] Unity 정리 ( Raycast I ) (0) | 2026.05.26 |
|---|---|
| [20260526] Unity 정리 ( Prefab ) (0) | 2026.05.26 |
| [20260522] Unity 정리 ( Unity 물리 엔진 기초 - Rigidbody ) (0) | 2026.05.22 |
| [20260521] Unity 정리 ( Unity 회전 처리 기초 - Euler, Quaternion, LookAt, RotateAround ) (0) | 2026.05.22 |
| [20260521] Unity 정리 ( Transform 이동 처리 기초 - Translate, Input, deltaTime ) (0) | 2026.05.21 |