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
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() 사용