리지드바디 개요(Rigidbody overview)
조인트(Joints)

콜라이더(Colliders)

Collider 컴포넌트는 물리 충돌 처리를 위한 오브젝트의 형태를 정의합니다. 콜라이더는 보이지 않는 요소이므로 오브젝트의 메시와 정확히 동일한 모양일 필요는 없으며, 실제로는 게임플레이 시에는 대략적인 근사치로도 크게 구분되지 않으며 더 효율적입니다.

가장 간단한(그리고 프로세서에 부하를 주지 않는) 콜라이더는 기본 콜라이더 타입입니다. 3D에서는 박스 콜라이더, 스피어 콜라이더, 캡슐 콜라이더가 바로 이 타입입니다. 2D에서는 박스 콜라이더 2D써클 콜라이더 2D를 사용할 수 있습니다. 복합 콜라이더 를 만들기 위해 하나의 오브젝트에 위와 같은 콜라이더를 몇 개든 추가할 수 있습니다.

복합 콜라이더의 위치와 크기를 잘 조정하면 오브젝트의 형태에 상당히 근접하게 만들 수 있으면서도 동시에 프로세서 오버헤드를 낮게 유지할 수 있습니다. 또한 자식 오브젝트에 추가 콜라이더를 둠으로써 유연성을 더 확보할 수도 있습니다(예를 들어, 박스는 부모 오브젝트의 로컬 축에 상대적으로 회전될 수 있습니다). 이러한 복합 콜라이더를 생성할 때에는 단 하나의 Rigidbody 컴포넌트만 존재해야 하며 계층 구조의 루트 오브젝트에 위치해야 합니다.

주의할 점은, 기본 콜라이더는 쉬어(shear) 변환이 일어난 경우 제대로 작동하지 않습니다. 즉, 로테이션과 불균일 스케일을 트랜스폼 계층 구조에서 모두 사용하여 결과적으로 형태가 더이상 기본 형태에 매치되지 않을 경우, 기본 콜라이더가 이를 정확히 나타내지 못합니다.

그러나 복합 콜라이더를 만들어도 충분히 정확히 표현하지 못하는 경우도 있습니다. 3D에서는 메시 콜라이더를 사용해서 오브젝트의 메시 형태에 정확하게 맞출 수 있습니다. 2D에서 폴리곤 콜라이더 2D는 일반적으로 스프라이트 그래픽의 형태에 완벽히 맞지 않지만, 형태를 원하는 수준의 디테일로 다듬을 수 있습니다. 단, 이러한 콜라이더는 기본 타입에 비해 훨씬 프로세서에 부하를 주므로, 성능 향상을 위해서는 꼭 필요한 경우에만 사용해야 합니다. 또한, 메시 콜라이더는 보통 다른 메시 콜라이더와는 충돌하지 못합니다(즉, 메시 콜라이더끼리 접촉해도 아무 일도 일어나지 않습니다). 이를 피하는 방법 중에는 메시 콜라이더를 인스펙터에서 Convex 로 설정하는 방법이 있습니다. 이렇게 하면 콜라이더 형태가 “볼록 다각형” 형태로 만들어지며, 오리지널 메시와 흡사하되 움푹 파인 부분이 전부 메워진 형태가 됩니다. 이 옵션의 장점은 컨벡스 메시 콜라이더는 다른 메시 콜라이더와 충돌이 가능하다는 점입니다. 따라서 움직이는 캐릭터가 적합한 형태를 띠는 경우 이 기능을 사용할 수 있습니다. 그러나 일반적으로는 메시 콜라이더는 씬 지오메트리에 사용하고, 움직이는 오브젝트의 형태는 복합 기본 콜라이더를 사용하여 유사하게 만드는 것을 규칙으로 합니다.

콜라이더는 씬의 바닥, 벽, 다른 고정된 요소를 만들기 위해 Rigidbody 컴포넌트 없이도 오브젝트에 추가될 수 있습니다. 이러한 콜라이더는 정적 콜라이더라고 부릅니다. 일반적으로, 정적 콜라이더는 트랜스폼 포지션을 변경하여 위치를 변경해서는 안 됩니다. 이렇게 할 경우 물리 엔진의 성능에 큰 영향을 미치기 때문입니다. 리지드바디가 있는 오브젝트의 콜라이더는 동적 콜라이더라고 부릅니다. 정적 콜라이더는 동적 콜라이더와 상호작용이 가능하지만, 정적 콜라이더에는 리지드바디가 없기 때문에 충돌에 리스폰스하여 움직이지는 않습니다.

위에 링크된 다양한 콜라이더 타입의 레퍼런스 페이지에서 각 콜라이더의 프로퍼티와 사용법에 대한 구체적인 정보를 얻을 수 있습니다.

물리 머티리얼(Physics materials)

콜라이더가 상호 작용할 때, 콜라이더의 표면은 각각이 나타내는 머티리얼의 프로퍼티를 시뮬레이션해야 합니다. 예를 들어, 얼음판은 미끄러워야 하고 고무공 표면은 마찰이 크며 탄성이 강해야 합니다. 충돌 중에 콜라이더의 형태가 변형되지는 않지만, 마찰과 탄성은 Physics Materials 을 사용하여 설정할 수 있습니다. 적절한 파라미터 값을 찾아내려면 시행착오가 다소 필요하기는 하지만, 보통 얼음 머티리얼의 경우 0 또는 매우 낮은 마찰 값을 가지고, 고무 머티리얼은 높은 마찰과 거의 완벽한 바운스 값을 가집니다. 가능한 파라미터에 대한 디테일을 참조하려면 물리 머티리얼물리 머티리얼 2D 레퍼런스 페이지를 참조하십시오. 기존 이름을 함부로 바꿀 수 없어 물리 머티리얼의 3D 에셋 영문명은 Physic Material(끝에 s가 없음) 이고, 2D의 영문명은 Physics Material 2D(끝에 s가 있음) 입니다.

트리거(Triggers)

스크립팅 시스템은 충돌이 일어나는 시점을 감지하고 OnCollisionEnter 함수를 사용하여 액션을 초기화할 수 있습니다. 또한, 단순히 하나의 콜라이더가 충돌을 일으키지 않고 다른 콜라이더의 공간에 들어가는 것을 물리 엔진이 감지하도록 할 수도 있습니다. 콜라이더를 Trigger(Is Trigger 프로퍼티 사용)로 설정하면 이 콜라이더는 솔리드 오브젝트로 동작하지 않으며 그저 다른 콜라이더가 통과하도록 허용합니다. 다른 콜라이더가 이 콜라이더의 공간에 들어오면, 트리거는 트리거 오브젝트의 스크립트에 있는 OnTriggerEnter 함수를 호출합니다.

충돌 시 행해지는 스크립트 액션

충돌이 일어나면 물리 엔진은 충돌과 관련된 오브젝트에 있는 모든 스크립트에서 특정 이름을 가진 함수를 호출합니다. 충돌 이벤트가 발생했을 때의 동작을 정의하기 위해 원하는 대로 코드를 작성할 수 있습니다. 예를 들어, 차가 장애물에 부딪쳤을 때 충돌 음향 효과를 재생하도록 할 수 있습니다.

충돌이 감지되었을 때 가장 먼저 일어나는 물리 업데이트는 OnCollisionEnter 함수 호출입니다. 접촉이 지속되는 상황에서는 업데이트 동안 OnCollisionStay 함수가 호출되며, 마지막으로 이 접촉 상태가 종료되었음을 나타내는 OnCollisionExit 함수가 호출됩니다. 트리거 콜라이더의 경우 유사하게 OnTriggerEnter, OnTriggerStay, OnTriggerExit 함수를 호출합니다. 2D 물리의 경우 동일한 기능을 하는 함수를 제공하며, 함수의 이름에는 예를 들어 OnCollisionEnter2D처럼 위 함수명 끝에 2D 첨자가 붙습니다. 함수의 디테일과 코드 예시는 MonoBehaviour 클래스의 스크립트 레퍼런스 페이지를 참조하십시오.

일반 비트리거 충돌에서는 충돌에 관여하는 최소한 하나의 오브젝트가 비키네마틱 리지드바디를 가져야 한다는 추가 조건이 있습니다(즉, Is Kinematic 이 꺼져 있어야 합니다). 두 오브젝트가 모두 키네마틱 리지드바디이면 OnCollisionEnter 등의 함수가 호출되지 않습니다. 트리거 충돌의 경우 이 제약이 적용되지 않으며, 따라서 키네마틱과 비키네마틱 리지드바디 모두 트리거 콜라이더에 들어가면 OnTriggerEnter가 호출됩니다.

콜라이더 상호작용(Collider interactions)

콜라이더는 Rigidbody 컴포넌트의 환경 설정에 따라 서로 다르게 상호작용합니다. 정적 콜라이더(즉, 리지드바디가 전혀 붙어있지 않음), 리지드바디 콜라이더, 키네마틱 리지드바디 콜라이더 등 세 가지 중요한 환경설정이 있습니다.

정적 콜라이더(Static Collider)

정적 콜라이더는 콜라이더가 있지만 리지드바디는 없는 게임 오브젝트입니다. 정적 콜라이더는 항상 같은 위치에 그대로 있으면서 절대로 움직이지 않는 레벨 지오메트리에 사용됩니다. 리지드바디 오브젝트가 다가오면 정적 콜라이더와 충돌하지만 그래도 정적 콜라이더가 움직이지는 않습니다.

물리 엔진은 정적 콜라이더가 절대로 움직이거나 변하지 않는다고 가정하며, 때문에 이 가정을 기반으로 유용하게 최적화할 수 있습니다. 따라서 정적 콜라이더는 게임플레이 중에는 활성화/비활성화되거나 이동 또는 스케일되어서는 안 됩니다. 정적 콜라이더에 변경을 가하게 되면 추가로 물리 엔진에서 내부 재산출이 이루어져야 하고 결국 상당한 성능 저하로 이어지게 됩니다. 뿐만 아니라, 이러한 변화로 인해 콜라이더가 미정의 상태가 되어 물리 산출에 오류가 발생할 수도 있습니다. 예를 들어 어떤 정적 콜라이더에 변화가 있었을 때 이 콜라이더에 대한 레이캐스트는 콜라이더를 감지하지 못할 수도 있고, 또는 공간 내 임의의 포지션에서 감지하게 될 수도 있습니다. 게다가 움직이는 정적 콜라이더에 부딪친 리지드바디는 반드시 “깨어나지”는 않을 것이며 따라서 이 정적 콜라이더가 어떤 마찰도 일으키지 못합니다. 이러한 이유로, 리지드바디인 콜라이더만 변화의 대상이 되어야 합니다. 다가오는 리지드바디에 의해 영향은 받지 않지만 스크립트를 통해 움직이는 콜라이더 오브젝트를 만들고 싶다면 리지드바디를 전혀 붙이지 않는 방식이 아니라 Kinematic Rigidbody 컴포넌트를 추가하는 방식을 사용해야 합니다.

리지드바디 콜라이더(Rigidbody Collider)

리지드바디 콜라이더는 일반 비키네마틱 리지드바디와 콜라이더가 있는 게임 오브젝트입니다. 리지드바디 콜라이더는 물리 엔진에 의해 완전히 시뮬레이션되며 스크립트로부터 적용되는 충돌과 힘에 반응합니다. 다른 오브젝트(정적 콜라이더 포함)에 충돌할 수 있으며 물리를 사용하는 게임 내에서 가장 흔히 사용되는 콜라이더 설정입니다.

키네마틱 리지드바디 콜라이더(Kinematic Rigidbody Collider)

키네마틱 리지드바디 콜라이더는 콜라이더와 키네마틱 리지드바디가 있는(즉, 리지드바디의 IsKinematic 프로퍼티가 활성화됨) 게임 오브젝트입니다. 키네마틱 리지드바디 오브젝트는 Transform 컴포넌트를 수정하여 스크립트를 통해 움직일 수 있지만, 비키네마틱 리지드바디처럼 충돌이나 힘에 반응하지 않습니다. 키네마틱 리지드바디는 상황에 따라 움직이거나 활성화/비활성화되지만 그 외 상황에서는 정적 콜라이더처럼 동작하는 콜라이더에 사용해야 합니다. 예를 들어, 평소에는 움직이지 않는 물리 장애물처럼 동작하지만 필요할 때는 열 수 있는 미닫이문과 같은 경우에 사용합니다. 정적 콜라이더와 달리, 움직이는 키네마틱 리지드바디는 다른 오브젝트에 마찰을 가하며 따라서 접촉이 일어나면 다른 리지드바디를 “깨우게” 됩니다.

키네마틱 리지드바디 콜라이더는 움직이지 않고 있을 때에도 정적 콜라이더와는 다르게 동작합니다. 예를 들어, 콜라이더가 트리거로 설정되어 있으면 스크립트에서 트리거 이벤트를 받기 위해 리지드바디를 추가해야 합니다. 트리거가 중력의 영향을 받거나 물리 영향을 받지 않도록 하고 싶으면 해당 리지드바디의 IsKinematic 프로퍼티를 설정하면 됩니다.

Rigidbody 컴포넌트는 IsKinematic 프로퍼티를 사용하여 언제든 일반 동작 또는 키네마틱 동작으로 변경할 수 있습니다.

좋은 예로 “래그돌” 효과가 있습니다. 래그돌의 경우 캐릭터는 일반적으로 애니메이션 하에서 움직이지만 폭발이나 큰 충돌 시 물리적으로 던져집니다. 캐릭터의 팔다리에는 IsKinematic 이 디폴트로 활성화되어 있는 각각의 Rigidbody 컴포넌트가 주어집니다. IsKinematic 이 활성화되어 있는 동안은 팔다리가 애니메이션에 의해 일반적으로 움직이다가, 비활성화되는 순간 즉시 물리 오브젝트처럼 동작하기 시작합니다. 이 시점에서 충돌력 또는 폭발력으로 인해 캐릭터는 팔다리가 현실처럼 마구 흔들리면서 날아가게 됩니다.

충돌 액션 매트릭스

두 오브젝트가 충돌하면 이 오브젝트의 리지드바디 환경설정에 따라 여러 다른 스크립트 이벤트가 발생할 수 있습니다. 아래의 표는 오브젝트에 있는 컴포넌트에 따라 어떤 이벤트 함수가 호출되는지를 구체적으로 나타냅니다. 일부 조합의 경우 두 오브젝트 중에서 하나만 충돌의 영향을 받으며, 일반적으로는 Rigidbody 컴포넌트가 없는 오브젝트에는 물리가 적용되지 않는 것이 원칙입니다.

충돌 시 충돌 검사가 되고 메시지가 전송됩니다
정적 콜라이더 리지드바디 콜라이더 키네마틱 리지드바디 콜라이더 정적 트리거 콜라이더 리지드바디 트리거 콜라이더 키네마틱 리지드바디 트리거 콜라이더
정적 콜라이더   Y        
리지드바디 콜라이더 Y Y Y      
키네마틱 리지드바디 콜라이더   Y        
정적 트리거 콜라이더            
리지드바디 트리거 콜라이더            
키네마틱 리지드바디 트리거 콜라이더            
충돌 시 트리거 메시지가 전송됩니다
정적 콜라이더 리지드바디 콜라이더 키네마틱 리지드바디 콜라이더 정적 트리거 콜라이더 리지드바디 트리거 콜라이더 키네마틱 리지드바디 트리거 콜라이더
정적 콜라이더         Y Y
리지드바디 콜라이더       Y Y Y
키네마틱 리지드바디 콜라이더       Y Y Y
정적 트리거 콜라이더   Y Y   Y Y
리지드바디 트리거 콜라이더 Y Y Y Y Y Y
키네마틱 리지드바디 트리거 콜라이더 Y Y Y Y Y Y
리지드바디 개요(Rigidbody overview)
조인트(Joints)