Dynamic, Kinematic, Static Collision

FGPRJS·2022년 4월 26일
0

다음 영상을 보며 Collision/RigidBody에 대하여 이해하자.

Dynamic, Kinematic, Static 설정 외에, Collider의 종류 또한 영향을 주므로 참고하여야 한다.

공식 Collider 문서

복합 콜라이더 (Compound Collider)

RigidBody 공식 설명 및 복합 콜리더 설명

여러개의 Collider Component를 1개의 Component안에 만들어 놓으면 된다. 물론 이 경우에도 Rigidbody는 1개만 존재할 수 있다.

메시 콜라이더 대신 이렇게 사용할 것을 권고하고 있다.

정적 콜라이더 (Static Collider)

Rigidbody 컴포넌트 없이도 콜라이더를 게임 오브젝트에 추가하여 씬의 바닥, 벽, 기타 고정된 요소를 생성할 수 있습니다. 이러한 콜라이더는 정적 콜라이더라고 부릅니다.
이와 반대로, 리지드바디가 있는 게임 오브젝트의 콜라이더는 동적 콜라이더라고 부릅니다.
정적 콜라이더는 동적 콜라이더와 상호작용이 가능하지만, 정적 콜라이더에는 리지드바디가 없기 때문에 충돌에 리스폰스하여 움직이지는 않습니다.

Rigidbody 컴포넌트가 없는 모든 Collider를 정적 Collider라고 부른다.
충돌은 가능하지만, 그 충돌은 이 콜라이더를 움직이지는 않는다.
단, OnCollision등의 함수는 호출된다.

키네마틱 콜라이더 (Kinematic Collider)

키네마틱 리지드바디 콜라이더는 콜라이더와 키네마틱 리지드바디가 있는(즉, 리지드바디의 IsKinematic 프로퍼티가 활성화됨) 게임 오브젝트입니다.
키네마틱 리지드바디 오브젝트는 Transform 컴포넌트를 수정하여 스크립트를 통해 움직일 수 있지만, 비키네마틱 리지드바디처럼 충돌이나 힘에 반응하지 않습니다.
키네마틱 리지드바디는 상황에 따라 움직이거나 활성화/비활성화되지만 그 외 상황에서는 정적 콜라이더처럼 동작하는 콜라이더에 사용해야 합니다.
예를 들어, 평소에는 움직이지 않는 물리 장애물처럼 동작하지만 필요할 때는 열 수 있는 미닫이문과 같은 경우에 사용합니다.
정적 콜라이더와 달리, 움직이는 키네마틱 리지드바디는 다른 오브젝트에 마찰을 가하며 따라서 접촉이 일어나면 다른 리지드바디를 “깨우게” 됩니다.

  • 특정 상황에서만 움직이는 어떤 개체에서 사용될 것을 권장한다.
  • 힘의 영향을 완전히 무시하게 된다. Force를 줄 수 없다.
  • 움직이려면 Transform 컴포넌트를 수정하여 스크립트를 통해 움직여야만 한다.
  • 캐릭터로서, 평소에는 isKinematic을 켜놓다가, 어떤 특정한 충돌에 반응하였을 때 isKinematic을 꺼서 물리적인 영향을 줄 수 있다.

이것의 일반적인 예는 애니메이션 하에서 캐릭터가 정상적으로 움직이지만 폭발이나 심한 충돌에 의해 물리적으로 던져지는 "ragdoll" 효과입니다.
캐릭터의 팔다리에는 기본적으로 IsKinematic이 활성화된 자체 Rigidbody 구성 요소가 제공 될 수 있습니다.
팔다리는 IsKinematic이 모두 꺼질 때까지 애니메이션으로 정상적으로 움직이며 즉시 물리학 객체로 동작합니다.
이 시점에서 충돌이나 폭발력으로 캐릭터가 팔다리를 던져 설득력있게 날아갑니다.

  • Kinematic Rigidbody 2개의 충돌은 OnCollision 관련 함수 (OnCollisionEnter/Stay/Exit)를 호출하지 않는다.

트리거 (isTrigger)

스크립팅 시스템은 충돌이 일어나는 시점을 감지하고 OnCollisionEnter 함수를 사용하여 액션이 초기화할 수 있습니다.
또한, 단순히 하나의 콜라이더가 충돌을 일으키지 않고 다른 콜라이더의 공간에 들어가는 것을 물리 엔진이 감지하도록 할 수도 있습니다.
콜라이더를 트리거(Trigger)(Is Trigger 프로퍼티 사용)로 설정하면 이 콜라이더는 솔리드 오브젝트로 동작하지 않으며 그저 다른 콜라이더가 통과하도록 허용합니다.
다른 콜라이더가 이 콜라이더의 공간에 들어오면, 트리거는 트리거 오브젝트의 스크립트에 있는 OnTriggerEnter 함수를 호출합니다.

이 영역은 개념적인 영향으로, 물리적인 충돌을 담당하지는 않는다.

노멀 비트리거 충돌에서는 충돌에 관여하는 최소한 하나의 오브젝트가 비키네마틱 리지드바디를 가져야 한다는 추가 조건이 있습니다(즉, Is Kinematic 이 꺼져 있어야 합니다).
두 오브젝트가 모두 키네마틱 리지드바디이면 OnCollisionEnter 등의 함수가 호출되지 않습니다.
트리거 충돌의 경우 이 제약이 적용되지 않으며, 따라서 키네마틱과 비키네마틱 리지드바디 모두 트리거 콜라이더에 들어가면 OnTriggerEnter가 호출됩니다.

  • kinematic 여부에 상관없이, isTrigger = true인 Collider와 충돌하면, OnTrigger 관련 함수를 호출한다.

충돌 이해 표

  • 충돌 시 충돌 검사가 되고 메시지가 전송됩니다 (OnCollider...)
정적리지드바디 + 콜라이더(동적)키네마틱정적 트리거리지드바디 + 트리거키네마틱 + 트리거
정적Y
리지드바디 + 콜라이더(동적)YYY
키네마틱Y
정적 트리거
리지드바디 + 트리거
키네마틱 + 트리거
  • 충돌 시 트리거 메시지가 전송됩니다. (OnTrigger...)
정적리지드바디 + 콜라이더(동적)키네마틱정적 트리거리지드바디 + 트리거키네마틱 + 트리거
정적YY
리지드바디 + 콜라이더(동적)YYY
키네마틱YYY
정적 트리거YYYY
리지드바디 + 트리거YYYYYY
키네마틱 + 트리거YYYYYY
profile
FGPRJS

0개의 댓글