Transform

Transform
어디에 있는지 (Position) , 얼마나 돌아가 있는지 (Rotation), 얼마나 크기가 변했는지 (Scale) 를 관리하는 컴포넌트입니다.
모든 게임 오브젝트에 반드시 하나 있고 떼어낼 수 없습니다.
1. Vector3
Position, Rotation, Scale 모두 X, Y, Z 총 세칸이 있습니다.
세 값을 한 묶음으로 담는 형식이 바로 ==Vector3== 입니다.
| 축 | 방향 | 화살표 색 |
|---|---|---|
| X | 오른쪽 | 빨강 |
| Y | 위 | 초록 |
| Z | 앞 | 파랑 |
1-1) 자주 쓰는 상수
| 상수 | 값 | 뜻 |
|---|---|---|
Vector3.zero | (0, 0, 0) | 원점, 또는 아무 방향도 아님 |
Vector3.one | (1, 1, 1) | 세 축이 모두 1 |
Vector3.right | (1, 0, 0) | 오른쪽 |
Vector3.up | (0, 1, 0) | 위 |
Vector3.forward | (0, 0, 1) | 앞 |
반대쪽을 가리키는 Vector3.left·down·back도 있습니다. 값이 각각 음수로 바뀐 것입니다.
1-2) 방향과 길이
뱡향과 크기를 함께 담은 값을 벡터(Vector)라고 합니다.
==Vector3==는 방향과 자리로 사용될 수 있는데
방향으로 쓸 때 중요해지는 것이 길이입니다. 이 값을 돌려주는 것이 ==magnitude== 입니다.
Vector3 right = Vector3.right;
Debug.Log($"VectorLength: right의 길이는 {right.magnitude}입니다.");
출력 :
VectorLength: right의 길이는 1입니다.
1-3) normalized
길이를 1로 맞춘 같은 방향의 벡터를 돌려주는 것은 ==normalized== 입니다.
방향만 가져오고 크기는 알아서 정하는 용으로 사용됩니다.
Vector3 diagonal = Vector3.right + Vector3.forward;
Vector3 unitDiagonal = diagonal.normalized;
Debug.Log(unitDiagonal.magnitude);
출력 :
1
- ==Vector3변수.normalized== 는 원본을 바꾸지 않습니다.
하지만, ==Vector3변수.Normalize();== 는 원본도 같이 바꿉니다.
1-3) 한 축만 바꾸려고 할때
transform 이나 rotation의 경우 세개의 축 중에 한개의 축만 바꾸고 싶을 때는
세개의 축을 새로 만들어 대입을 해줘야합니다.
필드가 아니라 프로퍼티로 선언되어 있기 때문입니다.
transform.position.x = 1f; -> 컴파일 오류 발생
transform.position = new Vector3(1f, transform.position.y, transform.position.z); -> 올바른 방법
2. Quaternion
==transform.rotation== 이 돌려주는 것은 ==Quaternion== 이라는 다른 형식입니다.
- 장점
- 같은 방향으로 두 회전 축이 겹치면 더이상 분리되지 않는 ==짐벌락== 이 발생하지 않는다
- 각도와 회전축을 추출하는 것이 더 간단하다.
- 오일러각보다 보간할때 부드럽고 일정한 속도로 회전합니다.
3. 월드 좌표와 로컬 좌표
세계 전체의 원점을 기준으로 한 값 : ==월드좌표==
부모를 기준으로 한 값 : ==로컬좌표==
- 부모가 없으면 두 값이 같습니다.
- 인스펙터에서 보이는 값은 로컬값입니다.
- localScale과 lossyScale
==localScale== : 부모를 기준으로 한 배율
==lossyScale== : 부모들의 배율까지 전부 곱해진 결과
- lossyScale에는 읽기 전용이라 값을 넣을 수 없습니다.
| 월드 기준 | 로컬 기준 |
|---|---|
position | localPosition |
rotation | localRotation |
eulerAngles | localEulerAngles |
(읽기 전용) lossyScale | localScale |
4. Translate, LookAt
4-1) Translate
==transform.Translate(new Vector3(0f, 0f, 5f));==
-> 지금 자리에서 z축으로 5f 만큼 이동하라
==transform.position = new Vector3(0f, 0f, 5f);==
-> 0,0,5의 위치로 이동하라
4-2) LookAt
자기 앞쪽(파란축)이 대상을 향하도록 회전을 통째로 바꿉니다.
대상의 위치가 바뀌면 매 프레임 다시 불러야 합니다.
- transform을 넘기는 형태
transform.LookAt(_target); - 좌표를 넘기는 형태
transform.LookAt(new Vector3(0f, 0f, 0f));
LookAt과 LookRotation 차이점
==transform.LookAt()== 메서드는 오브젝트를 직접 회전하는 반면,
==Quaternion.LookRotation()== 메서드는 회전할 쿼터니언을 생성하는 것 입니다.
- LookAt과 LookRotation을 사용하여 타겟 위치로 플레이어 시선 따라게 하는 코드
transform.LookAt(_targetTransform);
transform.rotation = Quaternion.LookRotation((_targetVector - transform.position).normalized);
RotateTowards()
현재 쿼터니언과 목표 쿼터니언을 향해 회전하는 쿼터니언을 생성합니다.
이 메서드는 LookAt, LookRotation 메서드와는 다르게 즉시 회전하는 것이 아닌 일정한 속도로 회전합니다.
public static Quaternion RotateTowards(Quaternion from, Quaternion to, float maxDegreesDelta)
from -> 현재쿼터니언
to -> 목표쿼터니언
maxDegreesDelta -> 회전속도

![[Unity] 제네릭과 가변성(variance)](https://data.develog.develrocket.com/upload/develog/gmumdev/1791297148427-udtfz5/_____.png)
![[Unity] IEnumerator 개요](https://data.develog.develrocket.com/upload/develog/gmumdev/1791297506756-dx8ros/_____.png)