Transform은 Unity 에디터에서 오브젝트를 생성할때 모든 게임 오브젝트에 기본적으로 부여되는 컴포넌트이다.
이 Transfomr컴포넌트는 해당 오브젝트의 위치(Position), 회전(Rotation), 크기(Scale) 등의 변환 정보를 담고있다.
모든 게임오브젝트가 이 컴포넌트를 가지고 있기 때문에 이미 Unity에서 내장되어 따로 GetComponet<>()와 같은 메소드르 사용해서 불러올 필요없이 스크립트에서 바로 transform 을 사용해도 해당 게임 오브젝트의 Transform컴포넌트를 가르키게 된다.
일반적으로 transform에서 주로 사용되는 속성과 내용에 대해 정리해보자
transform.position
transform.rotation
transform.lossyScale
transform.eulerAngles
transform.forward
transform.up
transform.right
transform.position
현재 오브젝트의 위치정보를 담고있다. 타입은 Vector3 타입이며 x, y, z축의 값을 float타입으로 받고있다.
transform.rotation
현재 오브젝트의 회전정보를 담고있다. Quaternion타입을 가지며 x, y, z, w 축의 값을 float타입으로 받는다.
transform.lossyScale
현재 오브젝트의 부피정보를 담고있다. Vector3 타입으로 x, y, z축의 값을 float타입으로 받는다.
transform.eulerAngles
현재 오브젝트의 회전정보를 Vector3타입으로 x, y, z축값을 가지고 float타입으로 받는다.
transform.forward
현재 오브젝트의 전방 방향을 나타내는 Vector3값으로 주로 해당 오브젝트가 어느 방향을 향하게 할지 정할 때 사용된다.
후방 방향의 경우 -1을 곱해주는 방식으로 사용된다.
tranform.up
현재 오브젝트의 위쪽 방향을 나타내는 Vector3값으로 주로 오브젝트의 상단 방향을 정의하는데 사용된다.
아래 방향의 경우 -1을 곱해주는 방식으로 사용된다.
tranform.right
현재 오브젝트의 오른쪽 방향을 나타내는 Vector3값으로 주로 오브젝트의 우측 방향을 정의하는데 사용된다.
왼쪽 방향의 경우 -1을곱해주는 방식으로 사용된다.
transform.LookAt(Transform target)
transform.Rotate(Vector3 eulerAngles)
transform.Translate(Vector3 translation)
LookAt(Transform target)
해당 오브젝트를 주어진 타겟을 향하도록 게임 오브젝트를 회전시킨다.
Rotate(Vector3 eulerAngles)
주어진 오일러 각도만큼 게임 오브젝트를 회전시킨다.
Translate(Vector3 translation)
주어진 벡터만큼 게임 오브젝트를 이동시킨다.
tranform은 모든 게임오브젝트에 항상 부여되기 때문에, 일반적으로 gameObject에서 접근하는 메소드들 또한 이 tranform을 이용해 접근할 수 있다.
RaycastHit2D[] hits = Physics2D.BoxCastAll(transform.position, new Vector2(5, 5), 0.0f, Vector2.right, 0.0f, layerMask);
int cnt = 0;
for (int i = 0; i < hits.Length; i++) {
if (hits[i].transform.GetComponent<Monster>()) {
target = hits[i].transform;
break;
} else {
cnt++;
}
}
위의 코드는 BoxCastAll을 통해 RaycastHit2D타입을 가진 구조체에 접근하게 되는데, 이는 hits[i]
에 담겨 있다.
하지만, hits[i]
에 직접적으로 .GetComponent<>()와 같은 gameObject에서 사용되는 메소드를 사용하려면 오류가 발생한다. 이때 tranform을 이용해서 그 구조체에 접근해서 .GetComponent<>()를 사용하면 일반적인 gameObject에 접근한 것처럼 사용할 수 있다.
gameObject에 대한 상속을 Transform이 받았을 것이라 생각한다면 가능할 수도 있지만, 이 Transform은 gameObject클래스 내의 속성중 하나로 제공될 뿐, 딱히 상속을 받지 않는데서 이러한 특수한 상황이 Unity엔진에서 의도적으로 쉽게 gameObject에 접근할 수 있도록 편의를 생각하여 설계했다고 생각할 수 있다.