본문 바로가기

Unity

[Unity] 충돌처리

충돌이 일어나기 위해서는 두 가지 조건이 있습니다.

 

1. 충돌할 두 GameObject가 모두 Collider를 가지고 있어야 하며

2. 충돌하는 GameObject 중 하나는 Rigidbody를 가지고 있어야 합니다. 이 때 두 GameObject중 움직이는 것이 있다면 움직이는 GameObject가 Rigidbody를 가져야 합니다.

 

 

Collider가 잘 보이도록 키워놓은 그림입니다. 커다란 초록색 부분이 Collider입니다. 기본적으로 유니티에서 제공하는 Object를 생성할 때 그 오브젝트의 모양과 크기에 맞춘 Collider가 함께 생성됩니다. 직접 모델링한 오브젝트를 넣는다면 그에 맞춘 Collider도 생성하거나 그에 비슷하게 Collider를 맞춰주어야 합니다.

 

만일 Cube Object를 생성했다면 Box Collider가 기본적으로 탑재된 상태로 생성되며, Add Component에서 다양한 Collider를 추가하거나 변경할 수 있습니다.

 

충돌에는 두 가지 상황이 있는데 첫번째는 Collision, 두번째는 Trigger입니다.

 

먼저 Collision은 GameObject간에 물리적인 연산을 하며 충돌을 감지합니다. 이 때 RigidBody의 is Kinematic 속성은 꺼져 있어야 충돌이 발생합니다. 

 

스크립트에서 사용하는 Collision 함수는 다음과 같습니다. 

1. void OnCollisionEnter(Collision collison)

- 충돌이 시작되는 순간 호출

 

2. void OnCollisionStay(Collision collison)

- 충돌하는 동안 매 프레임마다 호출

 

3. void OnCollisionExit(Collision collison)

- 충돌이 끝날 때 호출

 

 

 

두 번째로 Trigger 함수는 다음과 같습니다.

1. void OnTriggerEnter(Collider collider)

- 충돌이 시작되는 순간 호출

 

2. void OnTriggerStay(Collider collider)

- 충돌하는 동안 매 프레임마다 호출

 

3. void OnTriggerExit(Collider collider)

- 충돌이 끝날 때 호출

 

 

함수의 인자로 받아오는 collision과 Collider는 해당 스크립트를 가진 오브젝트가 부딪힌 '대상'을 의미합니다.

무슨 말인지 이해가 잘 가지 않는다면 충돌 함수에 Debug.Log(collider.gameObject.name); 또는 Debug.Log(collision.gameObject.name); 를 넣어보시면 이해에 도움이 될 것 같습니다.

 

 

 

 

충돌을 구현했을 때, 충돌이 되지 않고 통과하거나 밀려나는 경우가 있습니다. 지금부터는 그 이유를 하나씩 짚어보겠습니다.

 

 

먼저 충돌 시 멈추지 않고 통과하는 경우부터 살펴보겠습니다.

 

1. Is Trigger에 체크가 되어있는가?

- Is Trigger는 이 오브젝트를 물리 충돌체가 아닌 트리거로만 사용하겠다는 의미입니다. 체크가 되어있다면 해제해주도록 합시다.

 

2. Rigidbody를 가진 오브젝트에 Is Kinematic이 체크가 되어있는가?

- Is Kinematic에 체크를 하면 물리 연산이 이루어지지 않습니다. 체크를 해제해줍시다

 

3. Rigidbody를 가진 오브젝트의 Constraints에서 Freeze Position에 체크가 되어 있는가?

- Freeze Position에 체크가 되어있다면 어째서인지 충돌체가 트리거로 동작합니다 체크를 해제해주도록 합시다.

 

4. Physics Layer에 체크가 해제되어 있는가?

- 오브젝트에서 Tag 옆을 보면 Layer가 있습니다. 이 Layer를 설정하여 해당 오브젝트가 어떤 것인지 지정할 수 있는데, [Edit] -> [Project Settings]의 Physics 항목의 맨 밑을 가면 체크 매트릭스가 있습니다. 여기에서 체크가 되어있다면 해당 체크 칸의 행값과 열값의 Layer는 충돌이 된다는 뜻입니다. 여기에서 체크가 해제되어 있다면 충돌하지 않습니다.

Player와 Map은 제가 임의로 추가한 Layer입니다. 없다고 당황하시면 안대여 ㅎ

 

 

다음은 오브젝트가 밀려나는 경우입니다.

 

1. 충돌하는 오브젝트가 둘 다 RigidBody를 가지고 있는가?

- Rigidbody 컴포넌트를 각 충돌체가 가지고 있다면 둘 다 물리연산이 실행됩니다. 가만히 있어야 하는 충돌체는 Rigidbody를 제거해줍시다.