Unity는 내장된 NVIDIA PhysX을 가지고 있습니다. 이는 고유의 최신 동작을 지원하고 일반적으로 매우 멋집니다.

기본사항

한 오브젝트를 물리력 하에 두려면, 여기에 단순히 Rigidbody 을 추가하면 됩니다. 이렇게 하면, 오브젝트는 중력에 영향을 받게 되고 월드에서 다른 오브젝트와 충돌하게 됩니다.

강체(Rigidbodies)

Rigidbodies는 물리적으로 시뮬레이트 된 오브젝트 입니다. 나무상자는 느슨한 객체처럼 플레이어가 밀고 다닐 수 있는 물건에 리지드바디를 사용하거나, 스크립트를 사용하여 리지드바디에 직접 힘을 가하여 움직일 수 있습니다.

사용자가 비운동학적 리지드바디(non-Kinematic Rigidbody)의 트랜스폼(Transform)을 직접 움직이면, 이는 다른 오브젝트와 올바로 충돌하지 않을 수 있습니다. 그 대신 리지드바디에 힘과 회전력을 가하여 움직여야 합니다. 리지드바디를 좀 더 복잡하게 움직이게 하려면 Joints을 추가합니다. 예를 들어, 물리적은 도어나 체인이 흔들거리는 크레인을 만들 수 있습니다.

리지드바디를 사용하면 차량을 현실로 만들 수 있습니다. 예를 들어 리지드바디를 사용하여 자동차를 만들 수 있는데, 사용자의 Input에 따라 힘을 가하는 스크립트와 4개의 Wheel Colliders을 사용합니다.

스크립트로 리지드바디에 힘을 가하는 비행기를 만들 수도 있습니다. 혹은 특별한 차량이나 로봇을 만들어 여러 가지 관절(Joints)을 추가고 스크립트를 통해 힘을 가할 수 있습니다.

리지드바디는 대부분 primitive colliders와 함께 사용됩니다.

팁:

  • 절대로 부모와 자식 리지드바디를 같이 두면 안됩니다.
  • 절대로 리지드바디의 부모를 크기 변경을(scale) 해서는 안됩니다.

운동학적 리지드바디(Kinematic Rigidbodies)

Kinematic Rigidbody는 isKinematic 옵션이 켜진 리지드바디입니다. 운동학적 리지드바디는 힘이나 중력, 충돌에 의해 영향을 받지 않습니다. 이들은 트랜스폼(Transform)의 위치나 회전을 명시적으로 설정하여 드라이브하거나 애니메이트 합니다. 하지만 다른 비운동학적 리지드바디(non-Kinematic Rigidbodies) 여전히 상호작용을 하기는 합니다.

운동학적 리지드바디는 다른 리지드바디와 충돌하면 그것을 올바로 깨우고, 그 위에 위치한 리지드바디에 마찰력을 적용합니다.

다음은 운동학적 리지드바디의 예제 입니다.:

  1. 사용자는 때로 오브젝트가 물리력의 지배하에 놓이기를 바라지면, 다른 상황에서는 스크립트나 애니매이션으로 명시적으로 제어하기를 원합니다. 예를 들면, 사용자가 애니메이션 캐릭터를 만들어 뼈에 리지드바디를 부착하고 관절(joint)와 연결해서 랙돌(Ragdoll)로 사용하고 싶어할 경우입니다. 대부분의 경우 캐릭터는 애니메이션의 제어 하에 있으므로, 사용자는 이 리지드바디를 운동학적(Kinematic)으로 만들 수 있습니다. 하지만 캐릭터가 충돌을 당했을 경우 랙돌(Ragdoll)로 변해 물리력의 지배하에 놓이기를 원합니다. 이렇게 하려면, 단순히 isKinematic 속성을 끄면 됩니다.
  2. 예를 들어, 움직이는 플랫폼을 만들어 그 위에 리지드바디 박스를 두려고 하면, 이 플랫폼은 리지드바디가 없는 단순 Collider 대신에 운동학적 리지드바디(Kinematic Rigidbody)을 만들어야 합니다.
  3. 애니메이트 되는 운동학적 리지드바디로 사용 가능한 관절(joint)을 사용하여 진짜 리지드바디을 따라 넣을 수 있게 하고 싶을 수도 있습니다.

정적 충돌체(Static Colliders)

Static Collider는 충돌체(Collider)는 있으나 리지드바디(Rigidbody)가 없는 게임오브젝트(GameObject) 입니다. 정적 충돌체는 항상 같은 장소에 머물며 절대 움직이지 않는 계층 기하구조에 사용됩니다. 사용자는 사용자 기존의 그래픽 메쉬(meshes)에 Mesh Collider을 추가하거나(더 나은 방법은 Import Settings의 Generate Colliders 체크 상자를 사용), 다른 충돌체 타입을 사용할 수 있습니다.

정적 충돌체는 절대로 프레임 단위로 움직여서는 안됩니다. 정적 충돌체를 움직이며 PhysX의 내부 재계산을 발생시키고 이는 매우 값비싼 작업이어서 커다란 성능저하를 가져오게 됩니다. 더구나 정적 충돌체를 기반으로 다른 리지드바디를 깨우는 행동은 정의되지 않았고, 움직이는 정적 충돌체는 이것이 접촉하는 리지드바디에 마찰력이 적용되지도 않습니다. 그 대신, 움직이는 충돌체는 항상 운동학적 리지드바디(Kinematic Rigidbodies)이어야 합니다.

캐릭터 제어기(Controllers)

사용자가 휴머노이드 캐릭터를 원한다면, Character Controllers을 사용합니다. 이는 제3자 플랫포머(third person platformer), FPS 사수(shooter), 혹은 다른 적군 캐릭터일 수 있습니다.

이 제어기(Controllers)는 그 느낌이 적당하지 않아서(Doom에서 사용자는 시간당 90마일로 달리다 한 프레임에서 멈추고 dime에 관심을 가집니다)물리의 법칙을 따르지 않습니다. 그 대신 캐릭터 제어기는 사용자 캐릭터가 벽을 따라 미끄러지고, 계단을 오르내리는 등을 할 수 있게 충돌 감지 기능을 합니다.

캐릭터 제어기는 힘에 의해 영향을 받지는 않지만 스크립트로 힘을 가하여 리지드바디를 밀 수는 있습니다. 일반적으로 모든 휴머노이드 캐릭터는 캐릭터 제어기를 사용하여 구현합니다.

캐릭터 제어기는 본질적으로 비물리적이므로, 사용자가 로프에서 스윙 하거나 큰 바위에 의해 밀리는 것과 같은 실제 물리학의 영향을 캐릭터에 주고자 한다면, 리지드바디를 사용해야 합니다. 그러면 사용자 캐릭터에 관절(joint)와 힘을 사용하게 할 수 있습니다. 캐릭터 제어기는 항상 Y 축을 따라 정렬되어 있으므로, 사용자 캐릭터가 공간에서 방향을 바꾸고자 할 경우(예: 중력의 변화), 리지드바디를 사용해야 합니다. 하지만 게임 캐릭터가 비물리적으로 행동하기를 기대한다는 사실 때문에 리지드바디를 캐릭터에 대해 적절하게 행동하도록 한다는 것은 난해한 작업임을 기억해야 합니다. 또 다른 차이점은, 캐릭터 제어기는 특정 높이의 계단에서 부드럽게 미끄러질 수 있는 반면, 리지드바디는 불가합니다.

리지드바디와 함께 캐릭터 제어기에 부모자식관계를 설정하면, "Joint"와 비슷한 동작을 보게 될 것 입니다.

역링크