메쉬 콜라이더
구체 콜라이더(Sphere Collider)

강체

Rigidbody를 통해 GameObject가 물리적 제어하에 동작하게 됩니다. 리지드 바디는 힘과 토크를 받아 현실적으로 오브젝트를 움직일 수 있습니다. GameObject는 중력의 영향을 받는 리지드 바디를 포함하거나, 스크립팅을 통해 더해진 힘으로 작동하거나, NVIDIA PhysX 물리 엔진을 통해 그 외의 오브젝트와 상호 작용해야 합니다.

프로퍼티

프로퍼티: 기능:
Mass The mass of the object (in kilograms by default).
Drag 힘에 의해 움직일 때, 오브젝트에 영향을 주는 공기 저항의 양. 0이면 공기 저항이 0이고, 무한대면 오브젝트는 즉시 움직임을 멈춥니다.
Angular Drag 토크에 의해 회전할 때 오브젝트에 영향을 주는 공기 저항의 양. 0이면 공기 저항 없음. 이 파라미터의 값을 무한대(infinity)로 설정하는 것만으로는 오브젝트의 회전을 즉시 중지할 수 없다는 점에 유의하십시오.
Use Gravity 활성화하면 오브젝트는 중력의 영향을 받습니다.
Is Kinematic 활성화하면 오브젝트는 물리 엔진에 의해 주도되지 않으며, Transform에 의해서만 조작될 수 있습니다. 이것은 플랫폼을 옮기려고 하는 경우나, HingeJoint를 추가한 리지드 바디를 애니메이션하려는 경우에 편리합니다.
Interpolate Rigidbody의 움직임이 어색할 때 다음 옵션 중 하나를 시도하십시오.
- None 보간을 적용하지 않는다.
- Interpolate 이전 프레임의 Transform에 따라 Transform 스무딩.
- Extrapolate 다음 프레임의 Transform에 따라 Estimated Transform 스무딩.
###연속 충돌 감지(Continuous Collision Detection) 고속으로 움직이는 오브젝트가 충돌을 감지하지 않고 빠져나가는 것을 방지하기 위해 사용합니다.
- Discrete Use Discreet collision detection against all other colliders in the scene. Other colliders will use Discreet collision detection when testing for collision against it. Used for normal collisions (This is the default value).
- Continuous 동적 콜라이더(리지드 바디 있음)에는 Discrete(불연속) 충돌, 정적 메쉬 콜라이더(리지드 바디 없음)에는 Continuous(연속) 충돌을 적용합니다. Continuous Dynamic을 적용한 리지드 바디에 대한 충돌은 Continuous한 충돌 감지를 합니다. 이것은 Continuous Dynamic을 적용한 오브젝트의 충돌 상대로서 사용합니다. (물리 연산 성능에 크게 영향을 주기 때문에, 빠른 오브젝트의 충돌로 문제가 나오지 않는 경우는 Discrete대로 하십시오.)
- Continuous Dynamic Continuous 및 Continuous Dynamic 충돌을 적용한 오브젝트에 대해 Continuous 충돌 감지를 수행합니다. 정적 메쉬 콜라이더(리지드 바디 없음)에도 Continuous 충돌을 적용합니다. 다른 콜라이더에 대해서는 Discrete 충돌 감지를 합니다. 고속으로 움직이는 오브젝트에 사용합니다.
Constraints 리지드 바디의 움직임에 대한 제한:-
- Freeze Position 월드 좌표계의 X, Y, Z 축으로 이동하는 리지드 바디를 선택적으로 중지합니다.
- Freeze Rotation 월드 좌표계의 X, Y, Z 축으로 회전하는 리지드 바디를 선택적으로 중지합니다.

세부정보

Rigidbody에 의해 GameObject가 물리 엔진의 제어하에 실행하게 됩니다. 따라서 현실적인 충돌, 다양한 종류의 조인트, 그 외의 멋진 동작에 대한 게이트웨이가 열립니다. 리지드 바디에 힘을 더함으로써, GameObject를 조작하여 Component를 직접 조정한 경우와는 다른 모양과 느낌을 만듭니다. 일반적으로 리지드 바디와 같은 GameObject의 Transform 중 하나만을 조작해서는 안됩니다.

Transform 과 Rigidbody 사이의 가장 큰 차이는 힘(force)의 사용 여부입니다. 리지드 바디는 힘과 토크를 받을 수 있지만 변환되지 않습니다. Transform은 이동하거나 회전할 수 있지만, 물리 특성의 사용과는 다릅니다. 스스로 시도해보면 그 현저한 차이를 느낄 것입니다. 리지드 바디에 힘/토크를 더하면 실제로 오브젝트의 위치나 Transform 컴포넌트의 회전을 변경합니다. 따라서 어느 하나만을 사용해야 합니다. 물리 특성 사용 중에 Transform을 변경하면, 충돌이나 기타 계산에 문제가 발생할 수 있습니다.

리지드 바디는 물리 엔진에 영향을 받기 전에 GameObject에 명시적으로 추가해야 합니다. 메뉴 바의 Components->Physics->Rigidbody 에서 선택한 오브젝트에 리지드 바디를 추가할 수 있습니다. 이제 오브젝트에서 물리 특성을 준비했습니다. 이것은 스크립팅을 통해 중력에 해당하는 힘을 받을 수 있지만,Collider 또는 조인트를 추가하여 정확히 원하는대로 작동시킬 수 있습니다.

Parenting

오브젝트가 물리 특성의 제어하에 있는 경우, Transform의 부모가 이동하는 방법에 반 독립적입니다. Parent를 이동하면 리지드 바디의 Child을 거기에 따라 당깁니다. 그러나, 리지드 바디는 중력 및 충돌 이벤트에 반응하여 낙하합니다.

스크립팅

리지드 바디를 컨트롤하기 위해 먼저 스크립트를 사용하여 힘 또는 토크를 추가합니다. “AddForce()”와 “AddTorque()”를 오브젝트의 리지드 바디에서 호출하여 작업을 수행합니다. 물리 특성을 사용할 때 오브젝트의 변환을 직접 변경하지 않도록 하십시오.

애니메이션

어떤 Ragdoll 같은 특정 효과를 만들 때, 애니메이션과 물리 특성간에 오브젝트의 컨트롤을 전환해야 합니다. 따라서 리지드 바디는 isKinematic 이라고 지정할 수 있습니다. 리지드 바디에 isKinematic이라고 되어 있는 경우, 충돌이나 힘, physX의 다른 부분의 영향을 받지 않습니다. 이것은 Transform 컴포넌트를 직접 조작하여 오브젝트를 컨트롤 할 필요가 있다는 뜻입니다. 키네마틱 리지드 바디는 다른 오브젝트에 영향을 주지만, 이들 자체는 물리 특성의 영향을 받지 않습니다. 예를 들어, 키네마틱 오브젝트에 추가되는 조인트는 거기에 추가된 다른 리지드 바디를 제한하고 키네마틱 리지드 바디는 충돌을 통해 다른 리지드 바디에 영향을 줍니다.

콜라이더

콜라이더는 충돌을 발생시키기 위해 리지드 바디에 함께 추가해야 하는 다른 유형의 컴포넌트입니다. 두 리지드 바디가 서로 충돌하는 경우, 물리 엔진은 두 오브젝트에 콜라이더가 추가될 때까지 충돌을 계산하지 않습니다. 콜라이더 없는 리지드 바디는 물리 특성 시뮬레이션 동안 서로를 통과합니다.

콜라이더는 리지드 바디의 물리 특성을 정의 합니다.
콜라이더는 리지드 바디의 물리 특성을 정의 합니다.

Component->Physics 메뉴에서 콜라이더을 추가합니다. 자세한 내용은 개별 콜라이더 컴포넌트 레퍼런스 페이지를 참조하십시오.

Compound Colliders

Compound 콜라이더는 원시적인 콜라이더의 조합으로 하나의 콜라이더로써의 동작을 보여주는 것입니다. 복잡한 메쉬를 콜라이더에서 사용하고 싶지만,Mesh Collider를 사용할 수 없는 경우에 편리합니다. Compound 콜라이더을 만들 때 콜라이더 오브젝트의 자식 오브젝트를 만든 다음, 각 자식 오브젝트에 원시 콜라이더을 추가합니다. 이에 따라 각 콜라이더을 별도로 쉽게 배치, 회전, 확대 축소 할 수 있습니다.

실제 Compound 콜라이더 설정
실제 Compound 콜라이더 설정

위의 그림에서, 건 모델(Gun Model) 게임 오브젝트에 리지드 바디가 연결되어 있고, 여러 원시 콜라이더를 가진 자식 오브젝트들을 포함합니다. 부모의 Rigidbody가 힘에 의해 움직인 경우, 자식 콜라이더가 따라 움직입니다. 원시 콜라이더는 환경에 있는 Mesh Collider와 충돌하고, 부모 Rigidbody는 Scene에서 가해진 힘에의해 자식 콜라이더와 다른 콜라이더가 상호작용 하는 방법을 변경합니다.

Mesh Collider끼리는 일반적으로 충돌하지 않지만, Convex로 선택하는 경우에만 충돌할 수 있습니다. 일반적인 해결책은 움직이는 모든 오브젝트에는 원시 콜라이더을 조합하고, 움직이지 않는 배경의 오브젝트에 Mesh Collider를 사용합니다.

연속 충돌 감지(Continuous Collision Detection)

연속 충돌 감지는 빠르게 움직이는 콜라이더가 서로 통과하지 않도록 하는 기능입니다. 이것은 일반 (Discrete) 충돌 감지 사용시, 오브젝트가 한 프레임에서 콜라이더의 한 쪽에 있고 다음 프레임에서 이미 콜라이더을 통과하는 경우에 발생할 수 있습니다. 이것을 해결하려면 빠르게 움직이는 오브젝트의 리지드 바디에서 연속 충돌 감지를 사용할 수 있습니다. 충돌 감지 모드를 Continuous로 전환하여, 리지드 바디가 정적 (즉, 리지드 바디가 없는) 메쉬 콜라이더를 통과하지 않도록 합니다. 충돌 감지 모드를 Continuous Dynamic로 전환하여, 리지드 바디가 충돌 탐지 모드를 Continuous 또는 Continuous Dynamic으로 설정한여 다른 지원되는 리지드 바디를 통과하지 않도록 합니다. 연속 충돌 감지는 Box, Sphere 및 Capsule의 콜라이더에서 지원됩니다. 연속 충돌 감지는 오브젝트에서 통과가 발생한 경우에 충돌을 잡기 위한 안전망이 목적이지만, 물리적으로 정확한 충돌 결과를 얻을 수 있는 것은 아니기 때문에 빠르게 움직이는 오브젝트에 문제가 있는 경우, TimeManger 인스펙터의 고정 Time step 변수를 줄여 시뮬레이션을 더 정밀하게 할 수 있습니다.

올바른 크기의 사용

GameObject의 메쉬 크기는 리지드 바디의 질량보다 훨씬 중요합니다. 천천히 이동하거나, 떠 있거나, 제대로 충돌하지 않는등 리지드 바디가 예상대로 정확히 동작하지 않는 경우 메쉬 에셋의 scale을 조정을 고려해야 합니다. Unity의 기본 단위 스케일은 1 unit = 1 미터이므로, 임포트된 메쉬의 크기가 유지되어 물리 계산에 적용됩니다. 예를 들어, 붕괴되고 있는 고층 빌딩은 나무를 쌓아 만든 탑과는 상당히 다른 형태로 무너지기 때문에 정확하게 조정하려면 크기가 다른 오브젝트를 모델링해야 합니다.

인간을 모델링하는 경우, Unity에서 그 인간의 신장이 약 2미터 인지 확인 합니다. 오브젝트가 올바른 크기인지 여부를 확인하려면 기본 큐브와 비교합니다. GameObject->Create Other->Cube를 사용하여 큐브를 만듭니다. 큐브의 높이는, 딱 1미터이기 때문에, 만들고 있는 인간은 2배의 신장입니다.

메쉬 자체를 조정할 수 없는 경우, Project View를 선택하고, 메뉴 바에서 Assets->Import Settings…를 선택하여 특정 메쉬 에셋의 균일한 스케일을 변경할 수 있습니다. 여기에서는 스케일을 변경하여 메쉬를 다시 임포트할 수 있습니다.

게임에서 GameObject를 다른 스케일로 인스턴스화 할 필요가 있는 경우, Transform의 스케일 축의 값을 조정해도 괜찮습니다. 단점은 물리 시뮬레이션은 오브젝트가 인스턴스화시에 더 많은 작업을 해야 하며, 게임에서 퍼포먼스 저하를 일으킬 가능성이 있다는 것입니다. 이것은 큰 손실은 아니지만, 다른 두 가지 옵션에서 스케일을 마무리할 만큼 효율적이지는 않습니다. 불균등한 스케일이면, 부모자식관계 사용시 원하지 않는 동작을 일으키는 경우가 있습니다. 이 때문에 모델링 프로그램에서 정확한 스케일로 오브젝트를 만드는 것이 항상 최적입니다.

  • 두 개의 리지드 바디의 상대적인 Mass는 리지드 바디가 서로 충돌할 때 어떻게 반응할지를 결정합니다.
  • 한 개의 리지드 바디의 Mass를 다른 것보다 크게 해도, 자유 낙하의 낙하 속도는 올라가지 않습니다. 이렇게 하려면 Drag를 사용합니다.
  • Drag 값이 낮으면 오브젝트가 무겁게 보이게 됩니다. 이 값이 높으면 가볍게 보입니다. Drag의 일반적인 값은 .001(금속 덩어리)과 10(깃털) 사이입니다.
  • 오브젝트의 Transform 컴포넌트를 직접 조작하고 있지만, 물리 특성이 필요한 경우, 리지드 바디를 추가하고 키네마틱스로 만듭니다.
  • Transform 컴포넌트를 통해 GameObject를 이동시키고 있지만, 충돌/트리거 메시지를 수신하려면 리지드 바디를 이동하고 있는 오브젝트에 추가해야 합니다.
  • Angular Drag 값을 무한대(infinity)로 설정하는 것만으로는 오브젝트의 회전을 즉시 중지할 수 없습니다.
메쉬 콜라이더
구체 콜라이더(Sphere Collider)