일반적으로 게임에서 게임 오브젝트를
움직이게 하려면 해당 오브젝트가
rigidbody 오브젝트인지
확인해야 합니다
rigidbody는 게임 오브젝트가 물리력의
영향을 받도록 하는 컴포넌트입니다
오브젝트가 중력에 의해 아래로 떨어지고
질량과 같은 물리적 속성을 가지며
저항과 속도를 발생시킵니다
게임 오브젝트에 rigidbody
컴포넌트를 추가하면 rigidbody 오브젝트라고
부르곤 합니다
rigidbody 컴포넌트는 상호 작용을 기반으로 한
물리력에 필요하며 게임 오브젝트가
다른 물리 오브젝트와 상호 작용을
하려면 연결된 충돌체가 있어야 합니다
rigidbody가 없으면 power cube가 공중에
떠 있기만 할 것입니다
추가했을 때 어떤 현상이 일어나는지 살펴봅시다
다른 컴포넌트와 마찬가지로 인스펙터
하단의 [Add Component] 버튼을
사용하거나 [Component] 상단 메뉴에서
추가할 수 있습니다
[Physics] 섹션에서 찾을 수 있습니다
이제 오브젝트가 중력의 영향을 받아
떨어지고 물리 엔진이나 적용된 힘으로
제어할 수 있습니다
rigidbody에는 다양한 옵션이 있습니다
먼저 게임 오브젝트의 중력과 드래그 및 Angular Drag를
제어하는 설정이 있습니다
오브젝트의 Mass는 오브젝트와의 충돌을 처리하는
방식에 영향을 줍니다
Mass가 높은 게임 오브젝트는 Mass가 낮은
게임 오브젝트와 충돌했을 때 덜
반응합니다
게임 오브젝트의 드래그는 다른 상호 작업
없이 얼마나 빨리 느려지는지에
영향을 줍니다
공기 저항과 비슷하다고 생각하십시오
그리고 직선 속도의 손실률을 결정하는 데
사용됩니다
비슷하게 Angular Drag는 게임 오브젝트의
각속도를 느리게 하는 데 영향을 줍니다
얼마나 빨리 회전하는지를
예로 들 수 있겠죠
예를 들어, 오브젝트를 돌리기 위해
토크를 추가하면
Angular Drag는 이 힘에 대한 저항력을
발생시킵니다 다음 옵션은
게임 오브젝트가 중력의 영향을
받는지 여부를 결정합니다
이 확인란을 선택해 중력을 사용합니다
중력 설정은 Unity에서 [Edit] -
[Project Settings] - [Physics] 영역에서 볼 수 있습니다
기본적으로 실제 세계 값인 -9.81을
갖는 3차원 벡터를 볼 수
있습니다
여기에서 전체적으로 사용자 지정할 수
있으므로 플랫포머를 위한 낮은
중력이나 퍼즐 게임의 일부로 다른
축을 설정하는 것과 같이 재미있는
효과를 만들 수도 있습니다
예를 들어, 값을 5로 설정해 Z축에
중력을 추가해 봅시다
이제 power cube가 전역 Z축
쪽으로 당겨집니다
[Is Kinematic] 설정은 rigidbody가
물리력에 반응할지 여부에 영향을 미칩니다
보통 씬을 시작할 때 물리 엔진은
rigidbody 오브젝트가 아닌 모든 정적
지오메트리를 확인하며 효율성을 위해
나중에 다시 확인하지 않습니다
그러나 정적 오브젝트를 이동시킬 때 물리 엔진은
정확하게 처리하기 위해 다른 모든 정적 오브젝트를
다시 확인해야 하고, 이것 때문에
성능이 저하될 수 있습니다
이를 해결하려면 키네마틱 rigidbody 오브젝트를
사용하여 translate 함수의 변형
명령을 통해 이동시킬 수 있습니다
이는 다른 오브젝트에는 영향을 주지만 자신에게는
영향을 주지 않는 물리 오브젝트를 사용할 수 있다는 뜻입니다
확실한 예는 퐁이나 브레이크아웃
형식 게임의 패들이 될 것입니다
이 예제에서 rigidbody power cube에
[Use Gravity]을 선택합니다
[Play]를 누르면 오브젝트가 지면에 떨어집니다
둥근 prop samoflange 공 오브젝트도 있는 데,
컴포넌트 설정은 비슷합니다
power cube에 중력이 없으면
아래로 떨어지지 않지만 다른 오브젝트의
영향을 받습니다
다른 오브젝트의 영향을 받지 않게 하려면
[Is Kinematic]을 사용합니다
그리고 변형을 통해 오브젝트를 이동시킬 수 있습니다
translate 함수가 있는
이 간단한 스크립트를 사용하여
매 프레임마다 앞으로 이동시켜
보겠습니다
화면에 보이는 대로 오브젝트가
다른 것과 계속 상호 작용을 하지만
rigidbody가 남아 있어 일정하게
물리 엔진에게 위치에 대한 정보를
제공하면서 동시에 물리 엔진이 모든
씬을 다시 확인하지 않도록 합니다
[Interpolate] 및 [Extrapolate] 설정은
떨림 현상을 해결합니다
rigidbody를 통해 오브젝트가 이동할 때
사소하지만 불필요한 움직임이 감지되면
[보간] 설정을 사용하여 이전 프레임을
기반으로 변형 이동을 부드럽게 합니다
그리고 [보외] 설정은 다음 프레임의
예상 위치를 기반으로 움직임을
부드럽게 합니다
다음 설정은 충돌 감지 유형에 대한 것으로
[Discrete], [Continuous]
[Continuous Dynamic]이 있습니다
기본값은 Discrete인데 다른 문제가
없으면 그냥 사용하는 것이 좋습니다
Continuous는 빠르게 움직이는 오브젝트용이며
정적 지오메트리와 상호 작용을 합니다
그리고 Continuous Dynamic은 빠르게 움직이는
오브젝트용이고 다른 동적 오브젝트와 상호
작용을 합니다
마지막으로 rigidbody 컴포넌트의
Constraints 섹션은 물리력에 의한
오브젝트의 이동과 회전을 제한할 수 있게 합니다
예를 들어, 테트리스 형식의
게임에서 정육면체가
아래로 떨어질 때 회전하지 않도록
하고 싶다면, 여기에서 회전 제약을
사용하여 회전을 제한할 수 있습니다
이 예제에서 power cube가
작업대에 떨어집니다 이것은 rigidbody이며
[Use Gravity]가 선택되어 있습니다
기본적으로 이런 형태로 떨어집니다
떨어질 때 회전하지 않도록 하려면
제약 내에서 회전을 중지시킵니다
이렇게 떨어져도 회전하지 않습니다