⭐ 유니티 좌표계

● 유니티는 왼손 좌표계 방식을 사용합니다.
○ 빨간 화살표는 x축 (좌우) / 파란 화살표는 z축 (앞뒤) / 초록 화살표는 y축 (위아래)
⭐ 트랜스폼(Transform) 이란?
● 모든 GameObject가 가지고 있는 기본 컴포넌트입니다.
● GameObject의 위치(Position), 회전(Rotation), 크기(Scale) 정보를 가지고 있습니다.
● 자식 오브젝트는 부모의 Transform 영향을 함께 받습니다.
| 구성 요소 | 설명 | 데이터 타입 |
| Position | 오브젝트의 위치 | Vector |
| Rotation | 오브젝트의 회전 | Quaternion |
| Scale | 오브젝트의 크기 | Vector |
Vector란?
● 크기(Magnitude)와 방향(Direction)을 모두 가지는 물리적/수학적 개념
● 하나의 점이나 위치가 아닌, 두 점 사이의 변화량 또는 이동량을 의미합니다.
Scale 속성은 LocalScale 밖에 없는 이유
● 부모가 회전했을 때 자식 오브젝트의 크기가 월드 기준으로 얼마나 되는지 계산하기가 어려움
● 따라서 LocalScale만 있음
Vector의 속성
| 속성 | 방향 | 벡터 표현 |
| Vector3.zero | 원점 | new Vector3(0, 0, 0) |
| Vector3.one | 모든 축 1 | new Vector3(1, 1, 1) |
| Vector3.up | 위 | new Vector3(0, 1, 0) |
| Vector3.down | 아래 | new Vector3(0, -1, 0) |
| Vector3.left | 왼쪽 | new Vector3(-1, 0, 0) |
| Vector3.right | 오른쪽 | new Vector3(1, 0, 0) |
| Vector3.forward | 앞 | new Vector3(0, 0, 1) |
| Vector3.back | 뒤 | new Vector3(0, 0, -1) |
Transform의 위치
● transform.Position
○ 오브젝트의 위치를 월드좌표 기준으로 나타내는 Vector 값 입니다.
● transform.localPosition
○ 오브젝트의 위치를 부모 오브젝트를 기준으로 나타내는 상대 위치 Vector 입니다.
● transform.Translate(Vector)
○ 현재 위치에서 Vector 크기만큼 이동시키는 함수입니다.
○ 직접 transform.Position을 바꿔주는 것과 동일한 기능입니다.
transform.Translate(speed * Time.deltaTime * Vector3.forward);

● Vector3.MoveTowards(Vector3 current, Vector3 target, float maxDistanceDelta);
○ current에서 target 방향으로 maxDistanceDelta 속도로 이동하는 함수입니다.
transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);

● Vector3.Lerp(Vector3 a, Vector3 b, float t)
○ 자주 쓰이는 선형 보간 함수로 a 위치에서 b 위치로 t 비율만큼 이동합니다.
○ 프레임 기반 애니메이션에 주로 사용됩니다.
transform.position = Vector3.Lerp(transform.position, target.position, 0.005f);

Transform의 회전
● transform.rotation
○ 오브젝트의 회전을 월드 좌표 기준으로 나타내는 Quaternion 값입니다.
● transform.localRotation
○ 오브젝트의 회전을 부모 오브젝트 기준으로 나타내는 Quaternion 값입니다.
● transform.Rotate(Vector3 eulers)
○ eulers 방향으로 회전하는 함수입니다.
○ transform.rotation을 직접 돌려주는 것과 같은 기능입니다.
transform.Rotate(speed * Time.deltaTime * Vector3.up);

● transform.eulerAngles
○ 오브젝트의 rotation을 오일러 각도(euler)로 반환합니다.
● transform.localEulerAngles
○ 오브젝트의 localRotation을 오일러 각도(euler)로 반환합니다.
● transform.RotateAround(Vector3 point, Vector3 axis, float angle)
○ point 좌표를 중심으로 axis 축으로 angle 각도만큼 회전합니다.
○ point → 회전 중심이 되는 월드 좌표
○ axis → 회전 축 (예: Vector3.up = y축 기준)
○ angle → 회전할 각
transform.RotateAround(target.position, Vector3.up, speed * Time.deltaTime);

● transform.LookAt(Transform target)
○ target 방향을 바라봅니다.
transform.LookAt(target);

● transform.TransformPoint(Vector3 position)
○ 위치, 회전, 크기 변환을 적용합니다.
○ 로컬 좌표 위치를 월드 좌표 위치로 변환할 때 사용합니다.
○ 오브젝트에 종속적인 위치 벡터를 변환할 때 사용합니다.
● transform.InverseTransformPoint(Vector3 position)
○ 위치, 회전, 크기 변환을 적용합니다.
○ 월드 좌표 위치를 로컬 좌표 위치로 변환할 때 사용합니다.
○ 오브젝트에 종속적인 위치 벡터를 변환할 때 사용합니다.
● transform.TransformVector(Vector3 vector)
○ 회전, 크기 변환을 적용합니다.
○ 로컬 방향 벡터를 월드 방향 벡터로 변환할 때 사용합니다.
● transform.InverseTransformVector(Vector3 vector)
○ 회전, 크기 변환을 적용합니다.
○ 월드 방향 벡터를 로컬 방향 벡터로 변환할 때 사용합니다.
● transform.TransformDirection(Vector3 direction)
○ 회전 변환만 적용합니다.
○ 로컬 좌표 기준 벡터를 월드 좌표 기준으로 변환할 때 사용합니다.
● transform.InverseTransformDirection(Vector3 direction)
○ 회전 변환만 적용합니다.
○ 월드 좌표 기준 벡터를 로컬 좌표 기준으로 변환할 때 사용합니다.
● Quaternion.euler(float x, float y, float z)
○ 오일러 각(euler)을 쿼터니언으로 변환합니다.
● Quaternion.Lerp(Quaternion a, Quaternion b, float t)
○ a 각도부터 b 각도까지 t 비율만큼 보간 회전합니다.
● Quaternion.LookRotation(Vector3 forward)
○ forward 방향을 바라보게 합니다.
오일러 각이 아닌 쿼터니언을 사용하는 이유?
유니티 Transform은 오일러 각(x, y, z)이 아닌 4개의 실수로 구성된 복소수로 오브젝트의 회전을 연산합니다.
오일러 각을 이용한 회전을 다루지 않는 이유는 각 축을 순차적으로 계산하기 때문에 짐벌락 현상이 발생하기 때문입니다.
짐벌락이란 두 개의 축이 겹치면 한 축의 회전각이 소실되는 현상을 의미합니다.
이러한 현상을 예방하기 위해 x, y, z 축과 w 스칼라(회전량) 값을 가지는 쿼터니언을 사용합니다.
쿼터니언은 회전축과 회전각을 이용해 한 번에 연산하기 때문에 짐벌락 위험이 없으며 성능적으로도 좋습니다.짐벌락 현상
Transform의 크기
● transform.localScale
○ 부모 기준 상대적인 크기(스케일) 값을 의미합니다.
● transform.lossyScale
○ 게임 오브젝트의 절대적인 크기힙니다. (월드 기준 크기)
○ 읽기 전용 → 직접적인 설정 불가
○ 월드 기준 크기를 설정하고 싶으면 게임 오브젝트를 최상위 오브젝트로 만들고 (부모를 null로) 크기를 설정한 후
다시 부모를 설정해주면 됩니다.
⭐ 월드 좌표와 로컬 좌표의 차이
transform을 다루다보면 transform.position / transform.localPosition과 같이
월드 좌표, 로컬 좌표가 나뉘어져 있다는 것을 알 수 있습니다.
월드 좌표란 절대적인 값을 의미하며 로컬 좌표는 상대적인 값을 의미합니다.
아래에서 그림을 통해 자세히 알아보겠습니다.

● 위와 같이 A, B 오브젝트가 있습니다.
● A와 B는 부모 자식 관계입니다. A - 부모 B - 자식
● A의 월드 좌표는 -3, 0, 0 B의 월드 좌표는 3, 0, 0 입니다.

● B 오브젝트의 로컬 좌표 값은 6, 0, 0 입니다.
● 부모인 A 오브젝트의 좌표로 부터 B 오브젝트의 위치가 바로 로컬 좌표 값입니다.
○ A 오브젝트의 -3, 0, 0 으로부터 3, 0, 0 까지의 거리는 6, 0, 0 이기 때문

● 인스펙터 창에서도 Position이 6, 0, 0 인 것을 확인하실 수 있습니다.
● 이미 아셨겠지만 인스펙트에 보이는 속성 값은 로컬 기준입니다.
'개발, IT > 유니티' 카테고리의 다른 글
| [Unity] 물리 충돌 이벤트 (OnTrigger / OnCollision (0) | 2025.10.20 |
|---|---|
| [Unity] 물리 충돌 처리를 위한 컴포넌트 (Collider / Rigidbody) (0) | 2025.10.19 |
| [Unity] 오브젝트의 생성과 파괴 (0) | 2025.10.15 |
| [Unity] 오브젝트(Object), 컴포넌트(Component)와 프리팹(Prefab) (0) | 2025.10.15 |
| [Unity] 유니티 생명주기 (0) | 2025.10.14 |
