유니티에서 충돌을 처리하기 위해선 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 영역에 있다가 나갔을때 호출됨

기본은 이렇게만 하면 위 세가지 함수가 정상적으로 호출되며 충돌감지시 처리를 하면 되는데, rigidbody 옵션과 collider 의 isTrigger 옵션에 따라 함수 호출이 안되는 경우가 있다. 이럴때 아래 옵션값을 확인하며 체크를 해보자

 

  • rigidbody2D의 Simulated 가 체크되어 있는가? (다른 충돌체와 상호작용을 원하지 않을때는 체크해제한다)
  • rigidbody의 Kinematic 속성이 켜져 있을 경우 순전히 운동성(속도, 가속도, 위치)만 가지므로 위의 OnCollisionEnter, Stay, Exit 함수도 호출되지 않는다 (충돌이 일어나지 않으므로 서로 물리법칙에 의해 튕겨 나가는 등의 인터렉션이 없다 !!)
    • Kinematic 을 유지한채 충돌감지를 하고 싶을땐
      1. Collider의 isTrigger 옵션을 켠다.
      2. OnTriggerEnter, OnTriggerStay, OnTriggerExit 를 사용한다.
        • OnTrigger, OnCollision 두 종류 함수는 결코 같이 호출되는 일이 없다.

결론

만약 두 오브젝트를 중력이나 충돌상호작용 등 물리법칙에 영향받지 않고 충돌감지만 하고 싶을때는 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

+ Recent posts