[Unity] 트랜스폼(Transform)에 대해 조금 더 공부하기
2022. 2. 14. 01:44ㆍGame Development/Unity
트랜스폼 컴포넌트(Transform Component)
- 게임 오브젝트의 위치(Position), 회전(Rotation), 크기(Scale) 값을 저장하고 있는 컴포넌트
- 부모 오브젝트와 자식 오브젝트의 계층 관계 상태를 저장하기 위해서도 사용되는 듯 하다.
- 게임 오브젝트는 항상 하나의 트랜스폼 컴포넌트가 존재한다. (UI의 경우, Rect Transform)
- 트랜스폼 컴포넌트가 없는 게임 오브젝트 생성은 불가능
부모-자식 관계 설정
- 부모 오브젝트가 이동, 회전, 크기 변환을 진행할 때, 그의 자식 오브젝트 또한 정확히 동일하게 동작한다.
- 사람의 몸이 움직이면 팔 역시 따라 움직이며, 팔은 손, 손은 손가락처럼 자식 오브젝트 또한 자식 오브젝트를 가질 수 있다.
- 자식 오브젝트를 여러 개 가질 순 있으나, 부모 오브젝트는 단 하나만 가질 수 있다.
로컬 좌표계(Local Coordinates)와 월드 좌표계(Global Coordinates)
- 모든 게임 오브젝트의 Inspector에서의 트랜스폼 값은 부모 트랜스폼 값에 상대적으로 나타나는 값 (로컬 좌표계)
- 사람이 걸으면, 몸의 위치는 이동하나 팔은 여전히 몸에 대해 상대적인 위치에 존재함
- 즉, 걷는다고 팔 또한 몸에서 떨어져서 이동하는 것은 아님. 여전히 몸이라는 중심에 대해 상대적인 위치에 존재함
- 자식 오브젝트는 보통 로컬 좌표를 가지고 작업하는 것으로도 충분하지만, 게임 플레이 중에는 월드 공간의 정확환 위치 또는 월드 좌표계를 사용하는 것이 더 유용
- 스크립트 상에서 트랜스폼의 로컬 및 월드 위치, 회전, 크기에 대한 프로퍼티 수정이 가능하며, 로컬과 월드 좌표 간 변환 또한 지원한다.
여기까지는 기본적으로 알고 있었던 내용이었다. 이 다음은 추가적으로 알게 된 내용
비균등 스케일(Non-Uniform Scale)
- 트랜스폼 컴포넌트의 Scale x, y, z 값이 서로 다른 값을 가지고 있는 경우를 말한다.
- 반대로, 트랜스폼의 Scale x, y, z 값이 모두 동일한 것을 균등 스케일(Uniform Scale)이라고 한다.
- 비균등 스케일은 유용할 순 있으나, 보통 그래픽 렌더링 속도가 느려지기 때문에 사용을 피해야 한다고 한다.
- 비균등 스케일은 균등 스케일을 사용할 때에 비해, 다음과 같은 문제가 발생할 수 있다.
- Sphere Collider, Capsule Collider, Light, Audio Source 등은 "radius" 프로퍼티를 통해 크기 조정이 가능한데, 게임 오브젝트를 비균등 스케일로 설정하더라도 그 모양대로 지원되지 않는다.
- 예를 들어, 게임 오브젝트를 타원형으로 만들더라도 위와 같은 컴포넌트들은 원형을 그대로 유지한다.
- 부모 오브젝트가 비균등 스케일이고, 그의 자식 오브젝트가 부모 오브젝트에 대해 회전할 경우, 해당 자식 오브젝트는 삐딱하거나 "베어낸" 것처럼 보일 수도 있다.
- 예를 들어, 비뚤어진 Box Collider는 렌더링된 메시(Mesh)의 형태와 정확히 매치되지 않을 것임
- 성능과 관련된 이유로, 비균등 스케일된 부모 오브젝트의 자식 오브젝트는 회전할 때, 자동으로 스케일이 업데이트 되지 않는다.
- 자식 오브젝트의 형태는 자식의 스케일이 나중에 결국 업데이트 될 경우, 갑자기 변하거나 마치 자식 오브젝트가 부모 오브젝트로부터 분리된 것처럼 보이는 현상이 나타날 수도 있다.
- Sphere Collider, Capsule Collider, Light, Audio Source 등은 "radius" 프로퍼티를 통해 크기 조정이 가능한데, 게임 오브젝트를 비균등 스케일로 설정하더라도 그 모양대로 지원되지 않는다.
스케일(Scale)의 중요성
- 트랜스폼의 스케일은 모델링 프로그램에서의 메시 크기와 Unity에서의 메시 크기 간의 차이를 결정
- Unity에서 메시 크기(트랜스폼의 스케일)는 매우 중요하며, 특히 물리 시뮬레이션 중에는 더 중요
- 리지드바디가 천천히 움직이거나, 떠 있거나, 제대로 충돌하지 않는 등 예상치 못한 동작이 나올 경우에는 메시 에셋의 스케일 값을 조정해봐야 한다.
- Unity 물리 엔진은 기본적으로 월드 공간에서 1 유닛(Unit)을 1m로 간주
- 따라서, 엄청 큰 오브젝트를 떨어뜨릴 경우, 마치 슬로우 모션으로 떨어지는 것처럼 보일 수 있음
- 실제 물리 시뮬레이션은 정확한데, 실질적으로 너무 큰 오브젝트가 긴 거리만큼 떨어지는 것으로 보는 셈
- 외부 프로그램에서 현실 크기에 기반하여 작업한 모델을 Unity에 임포트했다면, Unity 단위에서도 일치하는지 확인해봐야 한다. (1 유닛이 1m이므로 이것에 기반하여 크기 측정이 대략 가능)
게임 오브젝트의 스케일(Scale)에 영향을 줄 수 있는 요인은 다음과 같이 세 가지.
- 사용하는 3D 모델링 프로그램에서의 메시 크기
- 오브젝트의 Import Settings 에서 Scale Factor 값 설정
- 트랜스폼 컴포넌트의 Scale 값
- 제일 좋은 방법은 현실 크기로 모델을 생성하여 트랜스폼의 스케일을 변경하지 않도록 하는 것
- 모델이 Unity에서 크기가 달라졌다면, Import Setting 에서 Scale Factor 값 조정
728x90
반응형
'Game Development > Unity' 카테고리의 다른 글
[Unity] 빌트인 파티클 시스템(Built-in Particle System) : 메인 모듈(Main Module) (0) | 2022.02.17 |
---|---|
[Unity] C# 접근 한정자 + 인스펙터에서 변수 확인하기 (Debug Mode) (0) | 2022.02.15 |
[Unity] 클릭(터치)한 화면 좌표로 캐릭터 이동 시키기 (0) | 2022.02.01 |
[Unity] 그래픽 최적화를 하는 방법들 (Low Polygon, Clipping Planes, Occlusion Culling) (0) | 2022.01.30 |
[Unity] New Input System #2 | 키 입력을 스크립트에 전달하여 처리하기 (9) | 2022.01.26 |