RigidBody와 Collider, 그리고 충돌 감지

대인공·2022년 10월 11일
0

Unity

목록 보기
4/14
post-thumbnail

RigidBody

GameObject에 물리적 동작을 가능하게 해주는 Component이다.

해당 Component가 추가된 GameObject는 Forces에 따라서 반응한다.


RigidBody이동과 Transform이동

가장 큰 차이점은 Force를 사용한다는 것이다. RigidBody는 힘과 토크를 받을 수 있지만 Transform은 그렇지 않다.

주의할 점.
동일한 GameObejct의 RigidBody와 Trandform를 동시에 사용하지 않고, 하나만 조작해야 한다. 두가지 다를 사용하여 연산을 할 경우 문제가 발생할 수 있다.


Property

  1. Mass : 오브젝트의 질량 (Default 단위는 Kg)
  2. Drag : 오브젝트가 Forses에 의해 움직일때 공기저항이 영향을 미치는 정도
  3. Angular Drag : 오브젝트가 토크로 회전할 때 공기저항이 영향을 미치는 정도
  4. Use Gravity : 활성화 상태면 오브젝트는 중력의 영향을 받는다.
  5. Is Kinematic : 활성화 상태면 오브젝트는 물리 엔진으로 영향을 받지 않고 오로지 Transform으로만 조작된다.
  6. Interpolate : RigidBody의 움직임이 어색할 경우 다음중 선택
    - None : 보간이 적용되지 않는다.
    - Interpolate : 이전 프레임의 트랜스폼에 맞게 움직임을 부드럽게 처리한다.
    - EXtrapolate : 다음 프레임의 트랜스폼을 추청해 움직임을 부드럽게 처리한다.
  7. Collision Detection : 빠르게 움직이는 오브젝트가 충돌감지없이 다른 오브젝트를 지나쳐 가는것을 방지한다.
    - Discrete : 씬에서 다른 모든 Collider에 대해 불연속 충돌검사를 사용한다.
    - Continuous : RigidBody가 있는 동적 Collider에 불연속 충돌 검사를, RigidBody가 없는 정적 Collider에 스위핑 기반 연속 충돌검사를 사용한다.
    - Continuous Speculative : RigidBody와 Collider에 추측성 연속 충돌 검사를 사용한다.
  8. Constraints : RigidBody의 움직임에 대한 제약사항을 정한다.
    - Freeze Position : 월드 좌표계의 X,Y,Z측에서 이동하는 RigidBody를 제어한다.
    - Freeze Rotation : 로컬 좌표계의 X,Y,Z측에서 회전하는 RigidBody를 제어한다.

참조 : https://docs.unity3d.com/kr/2022.2/Manual/rigidbody-physics-section.html

Collider

GameObject에게 물리적으로 일어난 충돌을 감지해주는 Component이다.
일종의 센서라고 알고있으면 이해하기 쉽다.

유니티에서 기본적으로 제공하는 Collider가 몇가지 있다.

기본 콜라이더

기본 콜라이더는 가장 간단하며 프로세스에 부하를 가장 적게주는 모양이다.

각각의 모양은 이러하게 생겼다.

  1. Box Collider

  1. Sphere Collider

  1. Capsule Collider
  • 연산 속도의 순서
    Sphere > Capsule > Box


복합 콜라이더

기본 콜라이더 여러개를 합쳐 만든 복합 콜라이더 라는 것도 있다.
복합콜라이더를 사용하면 프로세서의 부하를 낮게 유지하면서 GameObject의 Mesh의 모양과 비슷하게 만들 수 있다.


다른 콜라이더들

1. Mesh Collider

복합 콜라이더를 사용했더라도 충분히 디테일하게 표현하지 못하는 경우도 있다. 이때 Mesh Collider를 사용하면 GameObject의 Mesh와 동일하게 맞출 수 있어 아주 세밀한 충돌도 감지할 수 있어진다.

  • Capsule모양의 오브젝트의 Mesh Collider

하지만 이는 프로세서에 매우 높은 부하를 주므로 반드시 필요한 경우에만 사용하여야 한다.
또한, 다른 Mesh Collider와의 충돌은 감지가 안되도록 설정되어 있다.

기본 설정이 저러하게 되어 있는 이유는 속도 저하를 방지하기 위함이다.
속성중 Convex옵션을 true로 하게 되면 충돌 감지가 되도록 설정할 수 있다.
하지만 "볼록 다각형"의 모양으로 콜라이더가 수정된다. 이는 원본과 유사하지만 움푹 파인 부분이 전부 메워져 있다.


2. Wheel Collider

차량의 바퀴에 사용할 목적으로 제공되는 콜라이더이다.
바퀴의 서스펜션, 바닥과의 마찰, 저항등을 세밀하게 설정할 수 있다.


3. Terrain Collider

유니티에 내장된 Terrain Engine를 이용하여 생성한 Terrain에 적용되는 Collider이다. 지형의 복잡도에 따라 프로세서의 부하가 높아진다.
이를 해결하기 위해서는 Low Poly Mesh를 이용하여 MeshCollider로 대체하는 것이다.



동적, 정적 콜라이더

  • 동적 콜라이더
    - GameObject에 RigidBody Component가 있으면 해당 오브젝트의 콜라이더를 동적 콜라이더라고 부른다.
  • 정적 콜라이더
    - GameObject에 RigidBody Component가 없으면 해당 오브젝트의 콜라이더를 정적 콜라이더라고 부른다.

동적 콜라이더와 정적 콜라이더끼리 상호작용은 가능하지만, 정적 콜라이더는 RigidBody Component가 없으므로 충돌에 대한 반응은 없다.



충돌 감지

유니티에서 말하는 충돌감지란 Collider Component를 가지고 있는 서로 다른 두 GameObject의 Collider끼리 물리적으로 접촉하는 것을 말한다.

이때 충돌 감지를 위해 필요하 조건이 두가지 조건이 있다.

충돌 감지 조건

  1. 충돌하는 GameObject 모두 Collider Component가 추가되어 있어야 한다.
  2. 충돌하는 GameOBject중 동적 콜라이더가 있어야한다.

( Triggers )

Collider의 Property중 Is Trigger라는 체크 항목이 있다. 이 항목을 true로 체크하면 해당 GameObject는 충돌현상은 일으키지 않지만 감지는 하게 된다.

  • 트리거란?
    - 충돌하는 두 오브젝트가 물리적 충돌현상은 일으키지 않고 서로 통과하지만 충돌 자체는 감지하는 것.

보통 센서 역할로 많이 사용한다.


충돌 콜백 함수

충돌하려 하는 두 GameOBject는 충돌시 발생하는 이벤트가 호출하는 콜백 함수가 있다.

  • Is Trigger 언체크 시
    - void OnCollisionEnter : 충돌이 시작했을 때
    - void OnCollisionStay : 충돌이 지속될 때
    - void OnCollisionExit : 충돌이 끝났을 때
  • Is Trigger 체크 시
    - void OnTriggerEnter : 충돌이 시작했을 때
    - void OnTriggerStay : 충돌이 지속될 때
    - void OnTriggerExit : 충돌이 끝났을 때

상호 작용

RigidBody Component의 사용자 설정에 따라 서로 다르게 상호작용 한다.
세 분류로 나눌수 있는데,

  1. 정적 콜라이더
  2. RigidBody Collider
  3. Kinematic RigidBody Collider

각각 충돌에 대해 다르게 반응한다.


1. 정적 콜라이더

- Collider Component는 있지만 RigidBody Component가 없는 GameObject를 지칭한다.

항상 같은 위치에 그대로 있으며 절대 움직이지 않는 오브젝트에 사용한다. (예시 : 지형)
동적 콜라이더가 충돌을 일으켜도 RigidBody Component가 없으므로 움직이지 않는다.


2. RigidBody Collider

- Collider Component와 RigidBody Component가 있는 GameObject를 지칭한다.
- 동적 콜라이더라고도 한다.


3. Kinematic RigidBody Collider

- RigidBody Property중 Is Kinematic옵션이 체크되어 있는 GameObject를 지칭한다.

Is Kinematic옵션이 체크된 GameObject는 Transform Component를 수정하여 움직일 수는 있지만, Is Kinematic옵션이 언체크된 GameObject처럼 충돌이나 힘에 반응하지 않는다.

상황에 따라 Is Kinematic옵션을 활성화 / 비활성화 하여 사용할 수 있다. 이러한 사용 방법은 평소에는 정적 콜라이더처럼 동작하는 GameObject에게 사용해야 한다.


충돌 액션 이벤트

참조 : https://docs.unity3d.com/kr/2020.3/Manual/CollidersOverview.html

profile
이제 막 시작하는 유니티 클라이언트

0개의 댓글