DevDino

[Unity 기술면접] OnCollision vs OnTrigger 본문

Unity/기술면접

[Unity 기술면접] OnCollision vs OnTrigger

데브다이노 2026. 1. 12. 06:24

"OnCollisionEnter와 OnTriggerEnter 이벤트가 각각 어떤 조건에서 발생하나요?"

OnCollision vs OnTrigger

OnCollision (물리적 충돌)

물리적인 반발력, 튕김, 속도 변화 등의 물리 연산이 동반되는 충돌입니다.

 

발생 조건

- 두 객체 모두 Collider의 IsTrigger가 비활성화(false)되어 있어야 합니다.


- 최소 한 객체는 isKinematic이 false인 Rigidbody를 가져야 정상적인 물리 충돌이 발생합니다.

 

이벤트 함수

- OnCollisionEnter(Collision collision): 두 Collider가 부딪히는 첫 시점에 1회 호출.


- OnCollisionStay(Collision collision): 충돌이 지속되는 동안 매 프레임 호출(Rigidbody가 Sleep 상태에 빠지면 호출이 멈출 수 있음).


- OnCollisionExit(Collision collision): 충돌이 끝나고 떨어질 때 1회 호출.

 

매개변수로 Collision 객체를 받으며, 여기에는 접촉한 상대의 정보뿐만 아니라 접촉 지점, 충돌 속도 등 상세한 물리 정보가 담겨 있습니다.

 

OnTrigger (영역 판정)

물리적인 충돌(반발력 등) 없이 서로 통과하며, 특정 영역에 진입/탈출했는지만을 판정합니다.


발생 조건

- 두 객체 중 최소 하나의 Collider에 IsTrigger가 활성화(true) 되어 있어야 합니다.

 

이벤트 함수

- OnTriggerEnter(Collider other): 어떤 Collider가 Trigger 영역에 처음 들어왔을 때 1회 호출.


- OnTriggerStay(Collider other): 영역 안에 머무는 동안 매 프레임 호출.


- OnTriggerExit(Collider other): 영역에서 빠져나갈 때 1회 호출.

 

매개변수로 Collider 자체를 받습니다. 충돌 지점 같은 물리 정보는 없으며, '누가 영역에 들어오고 나갔는지' 식별하는 데 집중합니다.

 

주의사항

isKinematic의 활용
Rigidbody의 isKinematic = true로 설정하면 물리 엔진의 힘(중력 등)은 무시되지만, Transform으로 직접 이동시키면서 OnTrigger 이벤트는 정상적으로 발생시킬 수 있습니다. 하지만 두 객체 모두 Kinematic이라면 OnCollision 이벤트는 발생하지 않습니다.

 

빠른 물체의 통과(터널링)
물체가 너무 빠르면 Update 주기 사이에 얇은 Collider를 통과해버려 이벤트가 누락될 수 있습니다. 이때는 Rigidbody의 Collision Detection 모드를 Continuous로 변경하여 해결합니다.

 

2D vs 3D
2D 프로젝트에서는 반드시 Collider2D, Rigidbody2D, OnCollisionEnter2D 등을 사용해야 하며, 2D와 3D 물리 엔진은 서로 상호작용하지 않습니다.

 

최적화 구조
부모-자식 구조로 복합적인 Collider를 구성할 때, Rigidbody는 최상단(Root) 오브젝트에 하나만 부착하는 것이 성능 및 물리 연산 안정성에 좋습니다.

 

참고
Unity - Rigidbody.OnCollisionEnter(Collision)
Unity - Collider.OnTriggerEnter(Collider)