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)
실습 단계
코드로 이동
transform.Translate() 또는 transform.position = new Vector3(...)
부드럽게 회전
transform.Rotate(Vector3.up * speed * Time.deltaTime)
위치 보간 (Lerp)
Vector3.Lerp(from, to, t) 또는 Vector3.MoveTowards()
타겟을 바라보기
transform.LookAt(target) 또는 Quaternion.LookRotation()
인터랙티브 시뮬레이터
슬라이더로 Position·Rotation·Scale을 바꾸며 캔버스가 실시간으로 갱신되는 모습을 보세요.
Inspector
🟢 초록 화살표 = 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() 사용