Transform

강성현
∙∙조회 4
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== 입니다.

csharp
Vector3 right = Vector3.right;
Debug.Log($"VectorLength: right의 길이는 {right.magnitude}입니다.");

출력 : 
VectorLength: right의 길이는 1입니다.

 

1-3) normalized

길이를 1로 맞춘 같은 방향의 벡터를 돌려주는 것은 ==normalized== 입니다.

방향만 가져오고 크기는 알아서 정하는 용으로 사용됩니다.

csharp
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에는 읽기 전용이라 값을 넣을 수 없습니다.

 

월드 기준로컬 기준
positionlocalPosition
rotationlocalRotation
eulerAngleslocalEulerAngles
(읽기 전용) lossyScalelocalScale

 

 


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을 사용하여 타겟 위치로 플레이어 시선 따라게 하는 코드
unity
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 -> 회전속도