/ UNITY

유니티 토막 지식_04

오늘은 상당히 진빠지는 시험을 보게 되어 추가적인 유니티 공부는 하지 못했다.

3D 물리

오늘 알아볼 것은 유니티에서 사용하는 물리에 관한 컴포넌트들을 살펴보겠다.

RigidBody

리지드바디(RigidBody)는, 앞서서도 여러 번 설명한 적이 있는 컴포넌트이다. 게임 오브젝트가 물리적 동작을 가능하게 하는 주요 컴포넌트이다.

리지드바디는 연결된 게임 오브젝트의 이동을 제어한다. 따라서 스크립트에서 포지션이나 회전처럼 TransForm의 프로퍼티를 변경시켜 오브젝트를 이동하려고 하면 안된다. 값을 변경하는 대신 Forces. 즉 오브젝트에 힘을 가하고, 그 힘에 대해 물리 엔진이 결과를 계산할 수 있도록 해야한다.

경우에 따라서 특정 게임 오브젝트에 리지드바디를 추가하되, 물리 엔진의 제어를 받는 것이 싫을 때가 있다. 예를 들면 스크립트 코드로 캐릭터를 직접 제어하면서도, 캐릭터가 트리거에 의해 감지되게 하려고 할 때가 있다.

리지드바디에는 Is Kinematic 이라는 프로퍼티가 있다. 이 프로퍼티는 물리 엔진의 제어대상에서 해당 컴포넌트를 제외한다. 키네마틱 프로퍼티가 켜져 있는 상태라면 스크립트에서 비물리적인 모션을 적용할 수 있다. 이러한 모션을 키네마틱 모션이라고 한다.

Unity_01

그림과 같이 체크박스를 통해 키네마틱을 켜고 끌 수 있다. 스크립트 안에서도 Is Kinematic의 값을 변경할 수 있지만, 성능 오버헤드가 발생한다고 하니 신중하게 사용하자.

※ 리지드바디의 휴면 : 리지드바디가 정의된 최소 선형, 또는 회전 속도보다도 더 느리게 이동하면 물리 엔진에서는 정지했다고 간주한다. 움직이지 않는 리지드바디는 다시 힘이 가해지거나 충돌하기 전 까지는 움직이지 않기 때문에 이때 유니티에서는 리지드바디를 “휴면” 모드로 설정한다. 이러한 최적화는, 리지드바디가 다음번에 WakeUp 할 때까지 프로세서의 자원이 사용되지 않는다.

Collider

콜라이더 컴포넌트는 물리적 충돌을 위한 게임 오브젝트의 모양을 정의한다. 흔히들 많이 이야기하는 충돌판정에 대한 컴포넌트이다.

콜라이더는 기본 콜라이더, 복합 콜라이더, 메시 콜라이더, 정적 콜라이더 등 많은 종류가 있다.

  1. 기본 콜라이더 : 가장 간단하고, 자원을 적게 먹는 콜라이더다. 3D에선 박스 콜라이더, 스피어 콜라이더, 캡슐 콜라이더가 이에 해당한다. 2D에서는 박스 콜라이더2D, 써클 콜라이더2D를 사용할 수있다. 기본 콜라이더를 여러 개 중첩해 복합 콜라이더를 만들 수 있다.

  2. 복합 콜라이더 : 자원을 적게 먹으면서도 게임 오브젝트의 대략적인 모양을 만들 수 있다.

  3. 메시 콜라이더 : 복합 콜라이더를 통해서도 게임 오브젝트의 모양을 표현하기 힘들고, 더 정확한 콜라이더 표현이 필요한 경우 사용하는 콜라이더이다. 이 콜라이더는 게임 오브젝트의 메시 모양에 정확히 맞출 수 있지만, 프로세서에 큰 부담을 주기 때문에 꼭 필요한 경우에만 사용해야 한다. 또한 메시 콜라이더와 메시 콜라이더, 즉 메시 콜라이더끼리는 충돌이 일어나지 않는 문제가 있다. 이 문제를 해결하기 위해서 메시 콜라이더는 인스펙터 창에서 Convex로 설정해 “볼록 다각형” 모양의 콜라이더로 생성할 수 있다. (파인 부분이 사라짐) 일반적으로 메시 콜라이더는 씬 지오메트리에 사용한다. 2D에서는 폴리곤 콜라이더 2D를 통해 세부 조절이 가능하다.

Unity_02

  1. 정적 콜라이더 : RigidBody 컴포넌트 없이 콜라이더를 게임 오브젝트에 추가하여 바닥, 벽과 같은 고정된 오브젝트에 사용하는 콜라이더를 말한다. 반대로 RigidBody가 있는 콜라이더는 동적 콜라이더라고 부른다. 정적 콜라이더는 동적 클라이더와 상호작용이 가능하나, 충돌에 의한 물리 이동이 일어나지 않는다.
트리거

콜라이더에 트리거를 사용하면 해당 콜라이더는 솔리드 오브젝트로 동작하지 않는다. 간단히 말해 부딛히지 않는 다는 뜻이다. 하지만 스크립트 내부에서 OnTriggerEnter 함수를 이용하여 해당 콜라이더가 다른 콜라이더와 부딛혔을 때(겹쳤을 때)의 로직 처리를 할 수 있다.

※ 충돌에 대한 콜백 함수

  1. OnCollisionEnter : 충돌이 감지되었을 때 가장 먼저 일어난다.

  2. OnCollisionStay : 충돌 -> 접촉이 지속되는 상황동안 계속 호출 접촉이 해제될 때 OnCollisionExit가 호출된다.

  3. 트리거의 경우 위에서 Collision을 Trigger으로 바꾼다. (OnTriggerEnter, OnTriggerStay, OnTriggerExit)

  4. 2D에서는 함수명 끝에 2D 첨자가 붙는다. ex) OnCollisionEnter2D

콜라이더 사이의 상호작용

콜라이더는 크게 정적 콜라이더, 동적 콜라이더로 나눌 수 있다. 이는 리지드바디의 유무에 따라서 구분하며, 추가적으로 키네마틱이 활성화된 리지드바디 콜라이더까지 추가하여 각각의 상호작용에 대해 알아보자.

  1. 정적 콜라이더 : 정적콜라이더는 앞에서 설명했듯 리지드바디가 없다. 따라서 항상 같은 위치에 절대 움직이지 않는 것에 주로 사용된다. 다른 동적 콜라이더를 가진 객체와 충돌해도 정적콜라이더는 움직이지 않는다.

  2. 리지드바디 콜라이더 : 일반적인 비키네마틱 리지드바디와 콜라이더를 가진 오브젝트가 동적 콜라이더이다. 물리엔진에 의해 제어되며 충돌, 힘 모두에 반응하여 움직일 수 있다. 가장 흔하게 사용되는 콜라이더이다.

  3. 키네마틱 리지드바디 콜라이더 : 리지드바디와 콜라이더를 함께 가졌지만 해당 리지드바디에 Iskinematic이 활성화되어있는 콜라이더를 말한다. 키네마틱 리지드바디 콜라이더는 정적 콜라이더처럼 힘과 충돌에 반응하지 않지만, 스크립트에 의한 TransForm 컴포넌트 수정을 통해서는 움직일 수 있다.

이 콜라이더는 상황에 따라 움직일 수 있지만 그 외 상황에서는 정적 콜라이더처럼 작용한다. 예를 들면 평소에는 움직이지 않는 장애물처럼 동작하지만, 필요할 때는 열 수 있는 문과 같은 경우이다. 정적 콜라이더는 다른 오브젝트에 마찰이 작용할 수 있으며, 접촉이 일어난 경우 다른 리지드바디를 WakeUp 시킬 수 있다.

※ 리지드바디 컴포넌트는 Iskinematic 프로퍼티를 사용하여 언제는 키네마틱, 일반 리지드바티로 전환할 수 있다. 이를 이용하는 좋은 예로 래그돌 효과가 있다. 래그돌 효과는 사망 애니매이션을 고정된 애니메이션으로 사용하는 것이 아니라 물리적인 터리를 통해 다양한 사망 모션을 연출하기 위한 기법이다.

이는 키네마틱 리지드바디를 이용하여 구현할 수 있다. 사망 직전까지는 키네마틱 리지드바디를 이용하여 애니메이션에 의해 일반적으로 움직이다가, 비활성화되는 순간 키네마틱을 비활성화시켜 물리오브젝트로 동작하게 하는 것이다. 폭발에 의해 날아가는 시체가 흐느적거리며 날아가는 장면 등이 이런 효과를 이용한 것이다.