Unity Term Book
핵심 & 아키텍처

Transform

Transform은 모든 GameObject에 필수인 Component로 Position·Rotation·Scale을 담당하며 씬 Hierarchy에서의 위치를 정의합니다. World/Local 공간과 Quaternion·Time.deltaTime 기초를 배우는 가이드입니다.

상상해 보세요...

Transform은 객체의 주소와 신분증과 같습니다. 어디에 있는지(Position), 어느 쪽을 보는지(Rotation), 얼마나 큰지(Scale)를 기록합니다. Transform이 없으면 Unity는 그 객체를 화면에 어디에 그릴지 알 수 없습니다.

개념 자세히

Transform은 두 좌표 공간에 데이터를 저장합니다: World Space (씬 원점 기준 절대)와 Local Space(Parent 기준 상대). transform.position은 World, transform.localPosition은 Local입니다.

회전은 내부적으로 Quaternion으로 저장되어 gimbal lock을 피합니다. 보통 transform.eulerAngles(x, y, z 도)로 다룹니다. 부드럽게 회전하려면 Quaternion.Slerp() 또는 transform.Rotate()를 쓰세요.

성능: 물리 객체(Rigidbody)를 transform.position에 직접 대입하면 Physics Engine을 건너뛰어 벽을 뚫을 수 있습니다. 대신 Rigidbody.MovePosition() 또는 AddForce()를 사용하세요.

World vs Local Space

📍

Position

Vector3(x, y, z)

🔄

Rotation

Quaternion / euler

⚖️

Scale

Vector3(1, 1, 1)

X → 오른쪽
Y → 위
Z → 전방
오른손 좌표계 (Unity)

실습 단계

1

코드로 이동

transform.Translate() 또는 transform.position = new Vector3(...)

2

부드럽게 회전

transform.Rotate(Vector3.up * speed * Time.deltaTime)

3

위치 보간 (Lerp)

Vector3.Lerp(from, to, t) 또는 Vector3.MoveTowards()

4

타겟을 바라보기

transform.LookAt(target) 또는 Quaternion.LookRotation()

인터랙티브 시뮬레이터

슬라이더로 Position·Rotation·Scale을 바꾸며 캔버스가 실시간으로 갱신되는 모습을 보세요.

0.0
0.0
0°
1.0

Inspector

Transform
Position (0, 0, 0)
Rotation (0, 0, 0)
Scale (1, 1, 1)

🟢 초록 화살표 = Forward

🔴 빨간 화살표 = Right

🟡 노란 점 = 원점 (0,0,0)

코드 예제

기본
using UnityEngine;

public class TransformBasics : MonoBehaviour
{
  [SerializeField] private float moveSpeed   = 5f;
  [SerializeField] private float rotateSpeed = 90f;  // degrees per second

  void Start()
  {
      // Set absolute World Space position
      transform.position = new Vector3(0f, 1f, 0f);

      // Rotate 45° around the Y axis
      transform.eulerAngles = new Vector3(0f, 45f, 0f);

      transform.localScale = Vector3.one; // (1,1,1) = original size
  }

  void Update()
  {
      // Move forward — multiply by Time.deltaTime so speed is FPS-independent
      transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);

      // Spin continuously around Y
      transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime);
  }
}

코드 예제

고급
using UnityEngine;

public class TransformAdvanced : MonoBehaviour
{
  [SerializeField] private Transform target;
  [SerializeField] private float followSpeed = 3f;
  [SerializeField] private float rotateSpeed  = 5f;

  void Update()
  {
      if (target == null) return;

      // Smoothly approach the target without overshooting
      transform.position = Vector3.MoveTowards(
          transform.position,
          target.position,
          followSpeed * Time.deltaTime
      );

      // Smoothly look at the target with Slerp
      Vector3 dir = (target.position - transform.position).normalized;
      if (dir != Vector3.zero)
      {
          Quaternion lookRot = Quaternion.LookRotation(dir);
          transform.rotation = Quaternion.Slerp(
              transform.rotation, lookRot,
              rotateSpeed * Time.deltaTime
          );
      }

      // Convert World Position → this object's Local Space
      Vector3 localPos = transform.InverseTransformPoint(target.position);
      // localPos.x > 0: the target is to the right
  }
}

📌 빠른 정리

  • ▸Transform은 필수——어떤 GameObject에서도 제거할 수 없음
  • ▸.position = World, .localPosition = Local
  • ▸회전은 Quaternion으로 저장; 보통 .eulerAngles로 편집
  • ▸항상 × Time.deltaTime으로 FPS 독립 이동

⚠️ 흔한 실수

  • ❌ Time.deltaTime을 곱하지 않음

    120 FPS가 60 FPS보다 두 배 빠르게 움직임

    ✅ Update() 안에서 항상 × Time.deltaTime

  • ❌ Rigidbody가 있는 객체에 transform.position 사용

    물리를 건너뜀——벽 관통과 잘못된 충돌

    ✅ Rigidbody.MovePosition() 또는 AddForce() 사용