OpenVR 컨트롤러 입력(Input for OpenVR controllers)
Unity의 회전 및 오리엔테이션(Rotation and Orientation in Unity)

트랜스폼(Transform)

Transform 은 게임 오브젝트의 포지션, 회전, 스케일, 부모-자식 상태를 저장하기 위해 사용하며 따라서 매우 중요합니다. 게임 오브젝트에는 항상 하나의 Transform 컴포넌트가 있습니다. 이 트랜스폼을 제거하거나 변환이 없는 게임 오브젝트를 생성하는 것은 불가능합니다.

트랜스폼(Transform) 편집

트랜스폼은 X, Y, Z축으로 이루어진 3D 공간 또는 X, Y축만 있는 2D 공간에서 조작합니다. Unity에서는 이런 축을 각각 빨간색, 초록색, 파란색으로 나타냅니다.

축별 컬러가 표시된 트랜스폼
축별 컬러가 표시된 트랜스폼

트랜스폼은 씬 뷰에서 편집하거나 인스펙터에서 프로퍼티를 변경할 수도 있습니다. 씬에서는 이동, 회전, 스케일 툴을 사용하여 변환을 변경할 수 있습니다. 툴은 Unity 에디터의 왼쪽 상단에 위치합니다.

뷰, 이동, 회전, 스케일 툴
뷰, 이동, 회전, 스케일 툴

이 툴은 씬의 어떠한 오브젝트에도 사용할 수 있습니다. 어떤 오브젝트를 클릭하면 해당 툴의 기즈모가 그 안에 나타납니다. 선택한 툴에 따라 나타나는 기즈모의 모양이 달라집니다.

트랜스폼 기즈모
트랜스폼 기즈모

세 개의 기즈모 축 중 하나를 클릭하여 드래그하면 이 축의 컬러가 노란색으로 변합니다. 마우스를 드래그하면 오브젝트가 선택한 축을 따라 이동, 회전, 스케일되는 것을 볼 수 있습니다. 마우스 버튼에서 손을 떼어도 이 축은 선택된 상태로 유지됩니다. 뒤이어 마우스 가운데 버튼을 누르고 드래그하면 마우스 포지션과 무관하게 마지막으로 선택했던 축이 사용됩니다.

X축(노란색)이 선택된 트랜스폼
X축(노란색)이 선택된 트랜스폼

또한 이동 모드에서는 특정 평면에 대한 움직임을 잠글 수 있는 추가 옵션이 있습니다(즉, 두 축 방향으로만 드래그가 가능하고 나머지 한 축 방향으로는 변화하지 않음). 변환 기즈모 중심 주변에 놓인 세 개의 작은 색색 사각형은 각 평면을 잠그기 위해 사용합니다. 각 색상은 해당 사각형을 클릭했을 때 잠기게 될 축을 나타냅니다(예: Z축을 잠그려면 파란색 클릭).

부모-자식 관계 설정(Parenting)

부모-자식 관계 설정은 Unity 사용 시 이해해야 할 가장 중요한 개념 중 하나입니다. 어떤 게임 오브젝트가 다른 게임 오브젝트의 부모 일 경우, 그 자식 게임 오브젝트는 부모 오브젝트가 이동, 회전, 스케일할 때 정확히 동일하게 동작합니다. 부모-자식 관계는 사람의 몸과 팔 사이의 관계와 비슷하다고 볼 수 있습니다. 몸이 움직이면 팔 역시 몸을 따라 움직입니다. 또한 자식 오브젝트는 자신의 자식을 가질 수 있습니다. 따라서 손은 팔의 “자식”이라고 간주할 수 있고, 또 손에는 여러 개의 손가락이 달려있을 수 있습니다. 모든 오브젝트는 여러 개의 자식을 가질 수 있으나, 부모는 단 하나만 가질 수 있습니다. 이렇게 부모-자식 관계가 여러 계층 구조로 이루어지면 트랜스폼 _ 계층 구조_가 형성됩니다. 계층 구조의 맨 위에 위치한 오브젝트(즉, 이 계층 구조에서 부모가 없는 유일한 오브젝트)는 root 라고 합니다.

부모를 생성하려면 Hierarchy View 에서 원하는 게임 오브젝트를 다른 오브젝트로 드래그하면 됩니다. 이렇게 하면 두 게임 오브젝트 간에 부모-자식 관계가 생성됩니다.

부모-자식 계층 구조의 예시. 이름 왼쪽에 폴드아웃 화살표가 표시된 게임 오브젝트가 부모입니다.
부모-자식 계층 구조의 예시. 이름 왼쪽에 폴드아웃 화살표가 표시된 게임 오브젝트가 부모입니다.

모든 게임 오브젝트용 인스펙터의 트랜스폼 값은 부모 트랜스폼 값에 상대적으로 나타난다는 점에 유의해야 합니다. 이런 값은 local coordinates 를 나타냅니다. 몸과 팔의 예를 다시 들어 보면, 사람이 걸으면 몸의 포지션은 이동할 수 있으나 팔은 여전히 동일한 상대 포지션에 붙어 있게 됩니다. 씬 구성에 있어서 보통 자식 오브젝트는 로컬 좌표를 가지고 작업하는 것으로 충분하지만 게임플레이 중에는 월드 공간의 정확한 포지션 또는 global coordinates 를 사용하는 것이 더 유용합니다. Transform 컴포넌트용 스크립팅 API는 로컬 및 글로벌 포지션, 회전, 스케일용으로 별도의 프로퍼티를 가지고 있으며, 또한 어떤 점이든 로컬 및 글로벌 좌표 간에 변환할 수 있도록 해 줍니다.

비균등 스케일링 관련 제한 사항

비균등 스케일링은 트랜스폼의 Scale 이 x, y, z에 대해 서로 다른 값을 가지고 있는 경우(예: (2, 4, 2))를 말합니다. 이와 반대로 균등 스케일은 x, y, z에 대해 같은 값을 가진 경우(예: (3, 3, 3))입니다. 비균등 스케일은 몇몇 특정 경우에 유용하지만 보통은 그래픽 렌더링 속도가 느려지기 때문에 사용을 피해야 합니다. 또한 비균등 스케일을 사용하면 균등 스케일에서는 발생하지 않는 이상한 점이 나타날 수 있습니다.

  • 특정 컴포넌트는 비균등 스케일을 완전히 지원하지 않습니다. 예를 들어, 일부 컴포넌트는 radius 프로퍼티에 의해 정의되는 원형 또는 구형 요소를 포함하는데 Sphere Collider, Capsule Collider, Light, Audio Source 등이 바로 그 예입니다. 이러한 경우 원형을 비균등 스케일 하더라도 그 의도대로 타원형이 되지는 않으며 그대로 원형으로 남아 있을 것입니다.
  • 어떤 부모 오브젝트가 비균등 스케일되고 그 자식 오브젝트가 부모에 대해 회전한 경우, 이 자식 오브젝트는 삐딱하거나 또는 “베어낸” 것처럼 보일 수 있습니다. 단순 비균등 스케일을 지원하는 컴포넌트가 있으나 이와 같이 비뚤어진 경우 제대로 동작하지 않습니다. 예를 들어, 비뚤어진 Box Collider 는 렌더링된 메시의 형태와 정확히 매치되지 않을 것입니다.
  • 퍼포먼스와 관련한 이유로 비균등 스케일된 부모의 자식 오브젝트는 회전할 때 자동으로 스케일이 업데이트되지 않습니다. 그 결과 자식의 형태는 스케일이 결국 업데이트 될 때 갑자기 변하는 것처럼 마치 자식 오브젝트가 부모로부터 분리된 것처럼 보일 수 있습니다.

스케일의 중요성(Importance of Scale)

트랜스폼의 스케일은 사용하는 모델링 애플리케이션에서의 메시 크기와 Unity에서의 메시 크기 간의 차이를 결정합니다. Unity에서의 메시 크기(즉 변환의 스케일)는 매우 중요하며, 특히 물리 시뮬레이션 중에는 더 중요합니다. 물리 엔진은 기본적으로 월드 공간에서의 한 유닛이 1미터에 해당한다고 간주합니다.어떤 오브젝트가 매우 클 경우, “슬로우 모션”으로 떨어지는 것처럼 보일 수 있습니다. 이 시뮬레이션은 실제로 정확한데, 실질적으로 매우 큰 오브젝트가 긴 거리 만큼 떨어지는 것을 보는 셈이기 때문입니다.

오브젝트의 스케일에 영향을 줄 수 있는 요인은 세 가지가 있습니다.

  • 사용하는 3D 모델링 애플리케이션에서의 메시 크기
  • 오브젝트의 Import Settings 에서 Mesh Scale Factor 설정
  • Transform 컴포넌트의 Scale

이상적으로는 Transform 컴포넌트에서 오브젝트의 Scale 을 조정하지 말아야 합니다. 가장 좋은 방법은 현실 스케일로 모델을 생성하여 트랜스폼의 스케일을 변경할 필요가 없도록 하는 것입니다. 차선책은 메시를 임포트할 때 Import Settings 에서 각각의 메시에 대해 스케일을 조정하는 것입니다. 임포트 크기에 기반하여 특정 최적화가 일어나며 스케일 값을 조정한 오브젝트를 인스턴스화하면 성능 저하가 일어날 수 있습니다. 더 많은 정보를 확인하려면 Rigidbody 컴포넌트 레퍼런스 페이지에서 스케일 최적화에 대한 섹션을 참조하십시오.

트랜스폼 작업 팁

  • 트랜스폼의 부모-자식 관계를 설정할 때 자식을 추가하기 전 부모의 포지션을 <0,0,0>으로 설정하면 유용합니다. 즉 자식의 로컬 좌표가 글로벌 좌표와 동일해지며 자식이 올바른 포지션에 있는지 확인하기 쉬워집니다.
  • Particle System 은 트랜스폼의 Scale 에 영향을 받지 않습니다. 파티클 시스템을 스케일하기 위해서는 파티클 시스템의 파티클 이미터, 애니메이터, 렌더러에서 프로퍼티를 수정해야 합니다.
  • 물리 시뮬레이션을 위해 Rigidbodies 를 사용한다면 Rigidbody 컴포넌트 레퍼런스 페이지에서 스케일 프로퍼티에 대해 반드시 읽어 보십시오.
  • 환경 설정에서 트랜스폼 축(그리고 기타 UI 엘리먼트)의 컬러를 변경할 수 있습니다(메뉴: Unity > Preferences 으로 이동하여 Colors & keys 패널 선택).
  • 스케일을 변경하면 자식 트랜스폼의 포지션에 영향을 줍니다. 예를 들어, 부모를 (0,0,0)으로 스케일링하면 모든 자식이 부모에 대해 (0,0,0) 포지션에 놓이게 됩니다.
OpenVR 컨트롤러 입력(Input for OpenVR controllers)
Unity의 회전 및 오리엔테이션(Rotation and Orientation in Unity)