Transform 및 위치 이동

1. Transform 컴포넌트의 이해

  • Transform은 유니티 씬 안에 존재하는 모든 게임 오브젝트의 위치, 회전, 크기 정보를 담당합니다.
  • Transform은 모든 게임 오브젝트가 좌표계 상에 위치하기 위해 반드시 필요한 컴포넌트입니다. 유니티는 더 빠른 처리를 위해 내부적으로 오브젝트의 위치, 회전, 크기를 **4x4 행렬(Matrix)**로 연산합니다

주요 특징

  • 기본 컴포넌트: 모든 게임 오브젝트는 생성 시 자동으로 Transform 컴포넌트를 가집니다.
  • 계층 구조(Hierarchy): 부모-자식 관계를 형성하며, 자식 오브젝트는 부모 Transform의 이동과 회전 등 변화에 직접적인 영향을 받습니다.

Transform 속성 정리

속성 설명
position
월드 좌표(World Position) 기준 위치
localPosition
부모 Transform 기준 상대적 위치
rotation
월드 좌표 기준 회전 (Quaternion)
localRotation
부모 Transform 기준 회전
localScale
부모 Transform 기준 크기 비율
parent
부모 Transform 참조 (수정 시 부모 변경 가능)
childCount
현재 연결된 자식 오브젝트의 수

2. 위치, 회전, 크기 제어 (Transform Functions)

Vector3 (위치와 크기)

유니티에서 위치와 크기는 Vector3 클래스를 사용합니다.

  • 정의: 크기와 방향을 모두 가지는 개념으로, 단순한 점이 아니라 두 점 사이의 변화량 혹은 이동량을 의미하기도 합니다.
  • 구조: 3D 공간의 [x, y, z] 3축으로 정의됩니다.
이름 좌표 값 (x,y,z) 설명
Vector3.zero (0, 0, 0) 원점
Vector3.one (1, 1, 1) 모든 축 1
Vector3.up / down (0, 1, 0) / (0, -1, 0) 위 / 아래
Vector3.forward / back (0, 0, 1) / (0, 0, -1) 앞 / 뒤

Position (위치 이동)

구현 방식 코드 예시 특징
직접 변경 transform.position = new Vector3(x, y, z);
좌표값을 즉시 할당
상대 이동 transform.Translate(Direction * Speed);
현재 위치 기준 축 방향 이동
선형 보간 Vector3.Lerp(Start, End, Interpolation)
거리에 따라 빠르게 이동 후 천천히 감속
일정 속도 Vector3.MoveTowards(Current, Target, Speed)
목표를 향해 일정한 속도로 이동

Quaternion (회전)

인스펙터에서는 회전값이 [x, y, z] 각도로 표시되지만, 내부적으로 유니티는 **4원소(Quaternion)**를 사용합니다.

짐벌락

  • 사용 이유: 오일러 각도(x, y, z축 기반) 회전 시 발생하는 짐벌락(Gimbal Lock) 현상(두 회전축이 겹쳐 회전 자유도를 상실하는 문제)을 방지하기 위함입니다.
  • 특징: 회전 전체를 하나의 회전 벡터로 표시하여 계산 속도가 빠르고 안정적입니다

주요 함수:

  • Quaternion.Euler(x, y, z): 직관적인 3축 각도로 회전값 지정
  • transform.Rotate(axis, speed): 특정 축 기준 회전
  • transform.LookAt(target): 대상을 즉시 바라보게 설정

Scale (크기)

 

  • transform.localScale: 부모와의 비율에 따른 상대적 크기 조절
  • transform.lossyScale: 부모의 스케일과 상관없는 오브젝트 고유의 월드 스케일 수치(읽기 전용)

3. 프레임(Frame)과 델타타임(Time.deltaTime)

PC 사양에 따라 초당 출력되는 **FPS(Frames Per Second)**가 다릅니다. 만약 프레임마다 동일한 수치를 더해 이동시킨다면, 고사양 PC에서 캐릭터가 훨씬 빠르게 움직이는 문제가 발생합니다.

이를 해결하기 위해 **1프레임 갱신에 소요된 시간인 Time.deltaTime**을 이동값에 곱해주어야 합니다. 이를 통해 어떤 환경에서든 동일한 이동 속도를 보장할 수 있습니다.

Time.deltaTime의 중요성

  • 프레임(Frame): 화면의 한 컷
  • FPS: 초당 프레임 수
  • Delta Time: 한 프레임 갱신에 소요된 시간($\frac{1}{FPS}$)
  • 이동 로직에 Time.deltaTime을 곱해줘야 컴퓨터 성능(프레임 수)에 상관없이 일정한 속도로 움직입니다

4. 사용자 입력 처리 (Input Class)

사용자의 키 입력을 인식하여 캐릭터를 움직이는 가장 기초적인 방법입니다.

① GetKey 함수 (단일 키 입력)

  • Input.GetKey(): 키를 누르는 동안 계속 true 반환
  • Input.GetKeyDown(): 키를 누르는 순간 1회만 true
  • Input.GetKeyUp(): 키에서 손을 떼는 순간 1회만 false(반환값 주의)

② 축 입력 (Axis Control)

유니티 Input Manager에 설정된 가상 축을 이용하는 방식입니다.

  • Input.GetAxis(): -1.0 ~ 1.0 사이의 float 반환. 부드러운 가속/감속이 필요한 조이스틱이나 차량 이동에 적합합니다.
  • Input.GetAxisRaw(): -1, 0, 1 중 하나를 즉시 반환. 반응 속도가 중요한 키보드 기반 캐릭터 이동에 적합합니다.

💡 오늘의 정리

  • Transform은 오브젝트의 물리적 기본 데이터(위치/회전/크기)를 관리한다.
  • 회전 계산에는 Quaternion을 사용하여 짐벌락을 방지한다.
  • 이동 구현 시 기기별 성능 차이를 극복하기 위해 반드시 Time.deltaTime을 활용하자.

 

 

'유니티 > UnityEngine3D 입문 및 스크립팅 기초' 카테고리의 다른 글

코루틴  (0) 2026.01.02
물리, 충돌  (0) 2026.01.02
오브젝트, 프리팹, 생성과 파괴  (0) 2026.01.01
유니티 개요  (0) 2026.01.01