fullstack

[Unity3D] 충돌처리. Trigger와 Collision

Unity

- 충돌처리를 위한 조건


우선 충돌이 일어나기 위해서는 두 GameObject가 모두 Collider를 가지고 있어야 하며 둘 중 하나는 Rigidbody를 가지고 있어야 한다.

두 GameObject중 하나만 움직인다면 움직이는 GameObject가 Rigidbody를 가지고 있어야 한다.



위 그림은 Collider가 잘 보이게 하기 위해 GameObject보다 크기를 약간 키워 보았다. 위에서 보이는 초록색 부분이 Collider로 실제로 충돌을 감지하는 영역이다.

Unity에서 제공하는 Object들에는 기본적으로 Collider가 들어가 있으며 Box Collider, Sphere Collider, Capsule Collider 등이 있다. 만약 다른 Model을 불러와 작업한다면 Model에 알맞게 Collider를 설정해 주어야 올바른 충돌처리를 할 수 있다.




- Trigger


Trigger는 GameObject간의 물리적 연산을 하지 않고 충돌을 감지할 수 있다. 즉, 두 GameObject가 접촉했을때 서로 튕겨 나가지않고 그냥 통과하게 된다.

Trigger를 쓰기 위해서는 해당 Collider의 Is Trigger 항목을 체크해야 한다.

다음으로 스크립트에서 함수로 충돌 이벤트를 처리할 수 있다.


1
2
3
void OnTriggerEnter(Collider col) { }
void OnTriggerStay(Collider col) { }
void OnTriggerExit(Collider col) { }



다음과 같이 Enter, Stay, Exit 3가지 버전의 OnTrigger 함수를 만들 수 있다.
3가지 함수는 다음과 같은 특징을 나타낸다.
Enter - 충돌이 시작되는 순간 호출
Stay - 충돌이 되고있을 때 매 프레임마다 호출
Exit - 충돌이 끝날 때 호출

함수의 파라메터로 Collider 객체가 들어오며 col을 이용해 충돌한 GameObject에 대한 처리를 할 수 있다. 



- Collision

Collision은 Trigger와 다르게 물리적인 연산을 하며 충돌을 감지한다.
주의할 것은 Rigidbody의 Kinematic 속성이 꺼져 있어야 충돌이 발생할 수 있다.

1
2
3
void OnCollisionEnter(Collision col) { }
void OnCollisionStay(Collision col) { }
void OnCollisionExit(Collision col) { }



Trigger와 동일하게 3가지 함수를 만들 수 있으며 특징 또한 동일하다.

함수의 파라메터로 Collision 객체가 들어오며 col을 이용해 충돌한 GameObject에 대한 처리를 할 수 있다.



- Tag

충돌을 처리할 때 어떤 Object와 충돌을 했는 지도 중요하기 때문에 이에 대한 처리도 해주어야 한다. 이때 가장 많이 사용하는 것이 Tag 속성이다.

Tag 속성은 위와 같이 Inspector창에서 해당 GameObject의 Tag를 지정해 줄 수 있으며 Add Tag에서 새로운 Tag를 만들 수도 있다.


1
2
3
4
5
6
void OnTriggerEnter(Collider col) {
    if (col.tag == "Enemy")
    {
        // event.
    }
}



그럼 Enemy 라는 태그를 가진 GameObject랑만 충돌처리를 하고 싶다면 위와같이 if문으로 처리할 수 있다.
또한 다중 if문으로 여러 GameObject들에 다른 이벤트를 처리 할 수도 있다.