서론
유니티(Unity)의 리지드바디(Rigidbody)는 게임 오브젝트를 물리 시뮬레이션에 참여시키기 위해 사용되는 컴포넌트이다. 리지드바디는 물리 엔진을 기반으로 작동하며, 오브젝트에 힘과 운동을 적용하여 자연스러운 물리 효과를 구현하는 데 사용된다. 주로 물리 시뮬레이션을 위해 사용되며, 유니티의 물리 엔진은 충돌, 탄성, 마찰 등 다양한 물리 특성들을 지원한다. 이를 통해 게임 내의 오브젝트들이 더 현실적이고 자연스러운 움직임을 갖추도록 도와준다. 리지드바디를 사용하여 어려운 물리 효과를 직접 계산할 필요 없이 간단하게 물리 시뮬레이션을 구현할 수 있다.
Rigidbody
리지드바디를 게임 오브젝트에 추가하면 그 오브젝트는 물리 시뮬레이션에 의해 제어된다. 충돌, 중력, 운동 등과 같은 물리 특성들이 자동으로 처리된다. 리지드바디는 2D 게임과 3D 게임 모두에서 사용할 수 있으며, 각각 2D용 리지드바디와 3D용 리지드바디 컴포넌트가 있다. 일반적으로 리지드바디는 3D 리지드바디를 칭한다. 리지드바디의 주요 속성과 기능에는 다음과 같은 것들이 있다.
- 질량(Mass): 오브젝트의 질량을 지정할 수 있으며, 질량이 큰 오브젝트는 충돌시에 더 큰 힘을 전달한다.
- 중력(Gravity): 리지드바디에 중력 옵션을 적용하여, 중력에 따라 오브젝트가 떨어지는 동작을 구현할 수 있다.
- 운동(Movement): 힘(Force)이나 속도(Velocity)를 사용하여 리지드바디의 운동을 제어할 수 있다.
- 회전(Rotation): 토크(Torque)나 각속도(Angular Velocity)를 사용하여 리지드바디의 회전을 제어할 수 있다.
- 충돌(Collision): 다른 오브젝트와의 충돌을 감지하고, 충돌한 결과에 따라 물리적 반응을 수행한다.
- 트리거(Triggers): 리지드바디는 트리거(Collider)와 함께 사용하여 특정 이벤트를 감지하고, 이벤트 발생 시 특정 동작을 수행할 수 있다.
리지드바디는 물리 엔진의 영향을 받기 전에 게임 오브젝트에 명시적으로 추가해야한다. 메뉴의 Components->Physics->Rigidbody 에서 선택한 오브젝트에 리지드바디를 추가할 수 있다. 중력의 영향을 받고 스크립팅을 통해 힘을 받을 수 있지만 원하는 대로 정확하게 동작시키려면 Collider 나 Joint를 추가해야 한다.
프로퍼티
- Mass: 오브젝트의 질량(디폴트값은 킬로그램)
- Drag: 오브젝트가 힘에 의해 움직일 때 공기 저항이 영향을 미치는 정도를 나타낸다. 0이면 공기 저항이 없으며 무한대라면 오브젝트가 즉시 정지한다.
- Angular Drag: 오브젝트가 토크로 회전할 때 공기 저항이 영향을 미치는 정도를 나타낸다. 0이면 공기 저항이 없다. 앵글 드래그를 무한대로 설정한다고 해서 오브젝트의 회전이 멈추지는 않으니 주의해야 한다.
- Use Gravity: 활성화되면 오브젝트는 중력의 영향을 받습니다.
- Is Kinematic: 활성화되면 오브젝트는 물리 엔진으로 제어되지 않고 오로지 Transform 으로만 조작된다. 플랫폼을 옮기는 경우나 HingeJoint 가 추가된 리지드바디를 애니메이션화하는 경우에 유용하다.
- Interpolate: 리지드바디의 움직임이 어색해 보일 경우 다음 옵션 중에서 하나를 살펴보자.
- None: 보간이 적용되지 않는다.
- Interpolate: 이전 프레임의 트랜스폼에 맞게 움직임을 부드럽게 처리한다.
- Extrapolate: 다음 프레임의 트랜스폼을 추정해 움직임을 부드럽게 처리한다.
- Collision Detection: 빠르게 움직이는 오브젝트가 충돌의 감지 없이 다른 오브젝트를 지나쳐가는 것을 방지한다.
- Discrete: 씬에서 다른 모든 콜라이더에 대해 불연속 충돌 검사를 사용한다. 다른 콜라이더는 충돌 테스트에 불연속 충돌 검사를 사용한다. 일반적인 충돌에 활용된다(기본값).
- Continuous(Continuous Collision Detection, CCD, 지속적 충돌 감지): Continuous Collision Detection은 두 프레임 사이에서 오브젝트가 다른 오브젝트와 충돌할 때, 두 프레임 사이에 존재하는 경로 상에서 충돌을 탐지하는 메커니즘이다. 이를 통해 빠른 속도로 이동하는 오브젝트가 다른 오브젝트를 뚫고 지나가는 현상을 방지할 수 있다.
-
더보기예를 들어, 고속으로 이동 중인 총알이 벽과 충돌할 때, CCD가 사용되지 않으면 총알이 벽을 통과하고 맵 밖으로 나가는 문제가 발생할 수 있다. 하지만 CCD를 사용하면 총알의 경로 상에 충돌이 발생한 지점을 탐지하여, 총알이 벽과 충돌한 시점에서 움직임을 멈추도록 할 수 있다.
- Continuous Dynamic(Continuous Dynamic Collision Detection, CCD Dynamic, 동적 지속적 충돌 감지): Continuous Dynamic Collision Detection은 주로 빠른 속도로 움직이는 동적인 오브젝트에 사용된다. 이 옵션을 사용하면 빠른 속도로 움직이는 오브젝트도 CCD를 적용하여 충돌을 지속적으로 감지할 수 있다.
-
더보기일반적으로 "Dynamic"이라는 용어는 리지드바디가 중력과 같은 물리 힘에 의해 영향을 받아 움직이는 오브젝트를 의미한다. 이런 종류의 오브젝트는 Continuous Dynamic Collision Detection을 사용하여 빠른 속도로 움직일 때도 충돌 감지가 정확하게 이루어지도록 할 수 있다.
- Continuous Speculative: 리지드바디와 콜라이더에 추측성 연속 충돌 검사를 사용한다. 키네마틱 바디를 설정할 수 있는 유일한 CCD 모드입니다. 이 메서드는 스위핑 기반 연속 충돌 검사보다 리소스를 덜 소모한다.
- Constraints: 리지드바디의 움직임에 대한 제약사항이다.
- Freeze Position: 월드 좌표계의 X, Y, Z 축에서 이동하는 리지드바디를 선택적으로 중지시킨다.
- Freeze Rotation: 로컬 좌표계의 X, Y, Z 축에서 회전하는 리지드바디를 선택적으로 중지시킨다.
Rigidbody 2D
일반적으로 리지드바디 3D와 유사한 개념이 리지드바디 2D에도 적용되나 2D에서는 오브젝트가 XY 평면에서만 움직이고 그 평면에 수직인 축을 중심으로만 회전한다는 점이 다르다. 리지드바디 2D에는 크게 Body Type으로 나뉜다.
일반적으로 리지드바디 2D가 서로 충돌하는 것으로 묘사되지만 충돌하는 것은 리지드바디 2D의 각 바디에 연결된 콜라이더 2D이다. 리지드바디 2D는 콜라이더 없이 서로 충돌하지 않는다.리지드바디 2D의 바디 타입을 변경하는 것은 까다로운 과정일 수 있다. 바디 타입이 변경되면 다양한 질량 관련 내부 프로퍼티가 즉시 다시 계산되며 게임 오브젝트의 다음 FixedUpdate 동안 리지드바디 2D에 연결된 콜라이더 2D의 모든 기존 접점을 다시 계산해야 한다. 바디에 연결된 접점 및 콜라이더 2D의 수에 따라 바디 타입을 변경하면 성능에 변동이 있을 수 있다.
프로퍼티
바디 타입(Body Type): 동적(Dynamic)
Dynamic 리지드바디 2D는 시뮬레이션 상태에서 움직이도록 디자인되었다. 한정된 질량과 드래그 등 모든 프로퍼티를 사용할 수 있으며 중력과 힘에 영향을 받는다. 동적 바디는 다른 모든 바디 타입과 충돌하며 가장 인터랙티브한 바디 타입이다. 이 바디 타입은 움직여야 하는 항목에 가장 일반적인 바디 타입이므로 리지드바디 2D의 디폴트 바디 타입이다. 또한 동적 특성 및 주변의 모든 것과의 상호작용성으로 인해 성능 대비 비용이 가장 높은 바디 타입이다. 이 바디 타입에는 모든 리지드바디 2D 프로퍼티를 사용할 수 있습니다.
Dynamic 리지드바디 2D의 포지션이나 회전을 설정하기 위해 Transform 컴포넌트를 사용하지 말아야 한다. 시뮬레이션은 속도에 따라 Dynamic 리지드바디 2D를 재배치한다. 스크립트에 의해 적용되는 힘을 통해 직접 변경하거나 충돌과 중력을 통해 간접적으로 변경할 수 있다.
- Material: 특정 부모 리지드바디 2D에 연결된 모든 콜라이더 2D의 공통 머티리얼을 지정하기 위해 사용한다.
- Simulated: 리지드바디 2D 및 연결된 모든 콜라이더 2D와 조인트 2D가 런타임에 물리 시뮬레이션과 상호작용하도록 하려면 Simulated 를 활성화한다. 비활성화되면 이들 컴포넌트가 시뮬레이션과 상호작용하지 않는다. 이 체크박스는 기본적으로 활성화되어 있다.
- Use Auto Mass: 리지드바디 2D가 콜라이더 2D에서 게임 오브젝트의 질량을 자동으로 감지하도록 하려면 체크박스를 활성화해야한다.
- Mass: 리지드바디 2D의 질량을 정의한다. 오토 매스 사용을 선택한 경우 회색으로 표시된다.
- Linear Drag: 포지션 움직임에 영향을 미치는 저항계수이다.
- Angular Drag: 회전 움직임에 영향을 미치는 저항계수이다.
- Gravity Scale: 게임 오브젝트가 중력의 영향을 받는 정도를 정의한다.
- Collision Detection: 콜라이더 2D 간의 충돌을 검사하는 방식을 정의한다.
- Discrete: Collision Detection 을 Discrete 로 설정하면 리지드바디 2D 및 콜라이더 2D가 포함된 게임 오브젝트가 충분히 빨리 움직이는 경우 물리 업데이트 시 서로 겹치거나 통과할 수 있다. 충돌 접점은 새 포지션에서만 생성된다.
- Continuous: Collision Detection 을 Continuous 로 설정하면 업데이트할 때 리지드바디 2D와 콜라이더 2D가 포함된 게임 오브젝트가 서로 통과하지 않는다. 대신 Unity는 콜라이더 2D의 첫 번째 충돌 포인트를 산출하고 게임 오브젝트를 거기로 이동시킨다. 이 방식은 Discrete 보다 더 많은 CPU 시간을 사용한다.
- Sleeping Mode: 게임 오브젝트가 휴식 상태일 때 프로세서 시간을 절약하기 위해 “수면”모드에 들어가는 방법을 정의한다.
- Never Sleep: 수면 모드가 비활성화된다(시스템 리소스에 영향을 미칠 수 있으므로 가능하면 비활성화하지 말아야 한다).
- Start Awake: 처음에 게임 오브젝트가 깨어 있다.
- Start Asleep: 처음에 게임 오브젝트가 수면 상태이지만 충돌하면 깨어난다.
- Interpolate: 리지드바디의 움직임이 어색해 보일 경우 다음 옵션 중에서 하나를 살펴보자.
- None: 보간이 적용되지 않는다.
- Interpolate: 이전 프레임의 트랜스폼에 맞게 움직임을 부드럽게 처리한다.
- Extrapolate: 다음 프레임의 트랜스폼을 추정해 움직임을 부드럽게 처리한다.
- Constraints: 리지드바디의 움직임에 대한 제약사항이다.
- Freeze Position: 월드 좌표계의 X, Y, Z 축에서 이동하는 리지드바디를 선택적으로 중지시킨다.
- Freeze Rotation: 로컬 좌표계의 X, Y, Z 축에서 회전하는 리지드바디를 선택적으로 중지시킨다.
바디 타입(Body Type): 키네마틱
Kinematic 리지드바디 2D는 시뮬레이션 상태에서, 그리고 매우 명확한 사용자 제어 하에서 움직이도록 디자인되었다. Dynamic 리지드바디 2D는 중력과 힘의 영향을 받지만 Kinematic 리지드바디 2D는 영향을 받지 않는다. 이러한 이유로 빠르고 Dynamic 리지드바디 2D보다 시스템 리소스가 덜 필요하다. Kinematic 리지드바디 2D는 Rigidbody2D.MovePosition 또는 Rigidbody2D.MoveRotation을 통해 명확히 재배치되도록 디자인되었다. 충돌을 검사하려면 물리 쿼리를, 리지드바디 2D가 이동해야 하는 포지션 및 방식을 결정하려면 스크립트를 사용해야 한다.
Kinematic 리지드바디 2D는 여전히 속도를 통해 움직이지만 속도가 힘이나 중력의 영향을 받지 않는다. Kinematic 리지드바디 2D는 다른 Kinematic 리지드바디 2D나 Static 리지드바디 2D와 충돌하지 않고 Dynamic 리지드바디 2D와만 충돌한다. Static 리지드바디 2D(아래 참조)와 마찬가지로, Kinematic 리지드바디 2D는 충돌 시 (질량이 무한하여)움직일 수 없는 오브젝트처럼 작동한다. 바디 타입에는 질량 관련 프로퍼티를 사용할 수 없다.
- Material: 특정 부모 리지드바디 2D에 연결된 모든 콜라이더 2D의 공통 머티리얼을 지정하기 위해 사용한다.
- Simulated: 리지드바디 2D 및 연결된 모든 콜라이더 2D와 조인트 2D가 런타임에 물리 시뮬레이션과 상호작용하도록 하려면 Simulated 를 활성화한다. 비활성화되면 이들 컴포넌트가 시뮬레이션과 상호작용하지 않는다. 이 체크박스는 기본적으로 활성화되어 있다.
- Use Full Kinematic Contacts: Kinematic 리지드바디 2D가 모든 리지드바디 2D 바디 타입과 충돌하도록 하려면 설정을 활성화한다. 설정은 Dynamic 리지드바디 2D와 비슷하지만, Kinematic 리지드바디 2D는 다른 Rigidbody 2D 컴포넌트와 접촉할 때 물리 엔진에 의해 움직이지 않고 대신 질량이 무한한 움직일 수 없는 오브젝트처럼 작동한다. Use Full Kinematic Contacts 가 비활성화되면 Kinematic 리지드바디 2D는 Dynamic 리지드바디 2D와만 충돌한다. 체크박스는 기본적으로 선택 해제된다.
- Collision Detection: 콜라이더 2D 간의 충돌을 검사하는 방식을 정의한다.
- Discrete: Collision Detection 을 Discrete 로 설정하면 리지드바디 2D 및 콜라이더 2D가 포함된 게임 오브젝트가 충분히 빨리 움직이는 경우 물리 업데이트 시 서로 겹치거나 통과할 수 있다. 충돌 접점은 새 포지션에서만 생성된다.
- Continuous: Collision Detection 을 Continuous 로 설정하면 업데이트할 때 리지드바디 2D와 콜라이더 2D가 포함된 게임 오브젝트가 서로 통과하지 않는다. 대신 Unity는 콜라이더 2D의 첫 번째 충돌 포인트를 산출하고 게임 오브젝트를 거기로 이동시킨다. 이 방식은 Discrete 보다 더 많은 CPU 시간을 사용한다.
- Sleeping Mode: 게임 오브젝트가 휴식 상태일 때 프로세서 시간을 절약하기 위해 “수면”모드에 들어가는 방법을 정의한다.
- Never Sleep: 수면 모드가 비활성화된다(시스템 리소스에 영향을 미칠 수 있으므로 가능하면 비활성화하지 말아야 한다).
- Start Awake: 처음에 게임 오브젝트가 깨어 있다.
- Start Asleep: 처음에 게임 오브젝트가 수면 상태이지만 충돌하면 깨어난다.
- Interpolate: 리지드바디의 움직임이 어색해 보일 경우 다음 옵션 중에서 하나를 살펴보자.
- None: 보간이 적용되지 않는다.
- Interpolate: 이전 프레임의 트랜스폼에 맞게 움직임을 부드럽게 처리한다.
- Extrapolate: 다음 프레임의 트랜스폼을 추정해 움직임을 부드럽게 처리한다.
바디 타입(Body Type): 정적( Static)
Static 리지드바디 2D는 시뮬레이션 상태에서 전혀 움직이지 않도록 디자인되었다. 다른 오브젝트와 충돌하는 경우 Static 리지드바디 2D는 (질량이 무한하여) 움직일 수 없는 오브젝트처럼 작동한다. 또한 리소스를 가장 덜 사용하는 바디 타입이다. Static 바디는 Dynamic 리지드바디 2D와만 충돌한다. Static 리지드바디 2D는 움직이지 않도록 디자인되었기 때문에 서로 충돌할 수 없다.
- Material: 특정 부모 리지드바디 2D에 연결된 모든 콜라이더 2D의 공통 머티리얼을 지정하기 위해 사용한다.
- Simulated: 리지드바디 2D 및 연결된 모든 콜라이더 2D와 조인트 2D가 런타임에 물리 시뮬레이션과 상호작용하도록 하려면 Simulated 를 활성화한다. 비활성화되면 이들 컴포넌트가 시뮬레이션과 상호작용하지 않는다. 이 체크박스는 기본적으로 활성화되어 있다.
리지드바디 2D를 Static 으로 표시하는 데는 두 가지 방법이 있다.
- Collider 2D 컴포넌트가 포함된 게임 오브젝트의 경우 Rigidbody 2D 컴포넌트가 전혀 포함되지 않도록 한다. 이러한 콜라이더 2D는 모두 내부적으로 숨겨진 단일 Static Rigidbody 2D 컴포넌트에 연결된 것으로 간주된다. 이 방법은 빠르게 Static 콜라이더 2D를 만들 수 있는 방법이다. Static 콜라이더 2D를 많이 생성할 때는 콜라이더 2D가 포함된 각 게임 오브젝트에 리지드바디 2D를 추가하지 않는 것이 더 쉽다.
- 게임 오브젝트에 리지드바디 2D가 포함되고 해당 리지드바디 2D를 Static 으로 설정한다. 이 방법은 퍼포먼스와 관련한 이유로 필요하다. Static 콜라이더 2D를 런타임 시 움직이거나 재구성해야 하는 경우 자체 리지드바디 2D가 있을 때 그렇게 하는 것이 더 빠르다. 여러 콜라이더 2D를 런타임 시 움직이거나 재구성해야 하는 경우 각 게임 오브젝트를 개별적으로 움직이는 것보다 모두 Static 으로 표시된 한 부모 리지드바디 2D의 자식으로 지정하는 것이 더 빠르다.
주섬주섬
이 블로그 페이지는 리지드바디 공부하기 이전 세팅에 대해 자세히 알아보는 페이지이다. 주요한 부분은 Bold체로 표시했다. 게임의 대부분에 장르에서 리지드바디와 콜라이더가 많이 사용되기에 한 번 정리하는 것을 추천한다.
키네마틱을 첨 들어보는 이는 아래 접은 글로 설명을 보충해주었다.
Kinematic(키네매틱)은 물리 시뮬레이션에서 오브젝트의 움직임을 제어하는 방법 중 하나이다. 유니티(Unity)에서는 리지드바디(Rigidbody)를 사용하여 오브젝트를 물리 시뮬레이션에 참여시킬 수 있지만, 때로는 리지드바디를 사용하지 않고 키네매틱을 적용하여 오브젝트의 움직임을 직접 제어하기도 한다.
키네매틱 오브젝트는 물리 시뮬레이션에 영향을 주지 않고, 프로그래머가 움직임을 직접 제어할 수 있는 오브젝트를 말한다. 이는 주로 플레이어 캐릭터, NPC, 애니메이션과 상호작용하는 오브젝트 등에 사용된다. 키네매틱 오브젝트는 물리 엔진에 의해 힘과 운동이 자동으로 계산되지 않으므로, 개발자가 직접 위치, 회전, 스케일 등을 조작하여 원하는 동작을 구현할 수 있다.
키네매틱 오브젝트의 특징은 다음과 같다.
- 물리 시뮬레이션 무시: 키네매틱 오브젝트는 물리 시뮬레이션과 충돌을 무시한다. 다른 리지드바디와 충돌하더라도 영향을 받지 않으며, 물리 시스템에 의해 움직이지 않는다.
- 개발자 제어: 개발자가 직접 키네매틱 오브젝트의 움직임을 코드로 제어한다. 이를 통해 다양한 동작과 상호작용을 구현할 수 있다.
- 충돌 감지: 키네매틱 오브젝트는 물리 시뮬레이션에 참여하지 않지만, 충돌 감지를 위해 충돌체(Collider)를 사용할 수 있다. 이를 통해 다른 오브젝트와의 충돌을 감지하여 원하는 동작을 수행할 수 있다.
주의사항으로 키네매틱 오브젝트는 개발자가 직접 제어하므로, 오브젝트 간의 물리적 상호작용이 필요한 경우에는 Dynamic 리지드바디를 사용하는 것이 더 적합한다. 특히, 물리 시뮬레이션을 사용해야 하는 물리적 반응이 필요한 경우에는 리지드바디를 선택하는 것이 바람직하다. 키네매틱 오브젝트는 주로 애니메이션 기반 움직임이나 상호작용을 위해 사용되며, 물리 시뮬레이션보다 더 세밀하게 움직임을 제어할 수 있는 장점이 있다.
참고
'Unity > 물리' 카테고리의 다른 글
콜라이더(Collider) (0) | 2023.08.10 |
---|
댓글