유니티에서 충돌을 처리하기 위해선 rigidbody와 collider를 Object에 붙여야 한다.
하지만 프로젝트마다 충돌의 목적 및 기대결과가 다르고 두 컴포넌트간의 옵션값 설정에 따라 충돌감지 및 물리현상 발현 유무가 다르기 때문에 충돌에 대해 정확히 정리해야 할 필요가 있다.
- 충돌감지
- 양쪽 오브젝트에 Collider추가
- Collider와 Collider2D는 서로 감지가 안되므로 Collider는 Collider끼리 Collider2D는 Collider2D 끼리 추가
- 충돌을 감지할 오브젝트에 rigidbody 추가
- 위에서 2D를 달앗으면 rigidbody도 2D를 달아야함
- 꼭 두 오브젝트 모두에 rigidbody를 달 필요는 없음
- rigidbody가 달린 오브젝트에 monobehaviour 스크립트 추가하고 다음 세가지 함수 추가
- OnCollisionEnter - 다른 어떤 Collider가 내 Collider 영역으로 들어왔을때 호출됨
- OnCollisionStay - 다른 어떤 Collider가 내 Collider 영역에 있을때 호출됨
- OnCollisionExit - 다른 어떤 Collider가 내 Collider 영역에 있다가 나갔을때 호출됨
- 양쪽 오브젝트에 Collider추가
기본은 이렇게만 하면 위 세가지 함수가 정상적으로 호출되며 충돌감지시 처리를 하면 되는데, rigidbody 옵션과 collider 의 isTrigger 옵션에 따라 함수 호출이 안되는 경우가 있다. 이럴때 아래 옵션값을 확인하며 체크를 해보자
- rigidbody2D의 Simulated 가 체크되어 있는가? (다른 충돌체와 상호작용을 원하지 않을때는 체크해제한다)
- rigidbody의 Kinematic 속성이 켜져 있을 경우 순전히 운동성(속도, 가속도, 위치)만 가지므로 위의 OnCollisionEnter, Stay, Exit 함수도 호출되지 않는다 (충돌이 일어나지 않으므로 서로 물리법칙에 의해 튕겨 나가는 등의 인터렉션이 없다 !!)
- Kinematic 을 유지한채 충돌감지를 하고 싶을땐
- Collider의 isTrigger 옵션을 켠다.
- OnTriggerEnter, OnTriggerStay, OnTriggerExit 를 사용한다.
- OnTrigger, OnCollision 두 종류 함수는 결코 같이 호출되는 일이 없다.
- Kinematic 을 유지한채 충돌감지를 하고 싶을땐
결론
만약 두 오브젝트를 중력이나 충돌상호작용 등 물리법칙에 영향받지 않고 충돌감지만 하고 싶을때는 Rigidbody의 Kinematic을 켜고, Collider의 isTrigger 옵션을 체크한 후 OnTriggerOOO 함수를 Rigidbody가 달린 스크립트에 추가하자
'Unity' 카테고리의 다른 글
Batch 및 SetPass Calls (0) | 2020.12.03 |
---|---|
Quaternion 공간변환 (0) | 2020.11.23 |
IL2CPP (0) | 2020.09.29 |
Addressables (0) | 2020.07.28 |
Mobile 최적화 (0) | 2020.06.12 |