I'm FanJae.

[20260521] Unity 정리 ( Transform 이동 처리 기초 - Translate, Input, deltaTime ) 본문

Unity/Unity 초격차캠프

[20260521] Unity 정리 ( Transform 이동 처리 기초 - Translate, Input, deltaTime )

FanJae 2026. 5. 21. 23:54

1. Translate()

(1) 정의

- Translate()는 현재 오브젝트의 위치를 이동시키는 메서드다.

- 현재 위치를 기준으로 지정한 방향과 거리만큼 이동한다.

transform.Translate(이동값);
transform.Translate(이동값, 기준공간);

2. 이동과 프레임 보정

(1) Time.deltaTime

- 게임은 매 프레임마다 코드가 실행된다.

- 예를 들어 아래 코드가 있다고 가정한다.

transform.position += new Vector3(1, 0, 0);

- FPS가 30이면, 1초 동안 약 30번 실행, FPS가 60이면 1초 동안 약 60번 실행으로, FPS가 높을수록 빠르게 움직이는 문제가 발생한다. 이를 해결하기 위해 Time.deltaTime을 사용한다.


(2) 역할

- 이전 프레임부터 현재 프레임까지 걸린 시간을 계산한다.

- 프레임 속도에 영향을 받지 않도록 이동량을 보정한다.


3. 입력 처리

(1) Input Manager

- 입력 축(Input Axis)을 관리하는 설정이다.

 

- Unity의 입력 방식은 Input Manager와 새로운 방식인 Input System으로 나뉜다. Input System은 입력 액션(Input Action)을 따로 정의해서 키보드, 마우스, 게임패드 입력을 더 체계적으로 관리할 수 있다.

- 예제에서는 기존 Input Manager 방식을 사용했다. 프로젝트에서 어떤 입력 방식을 사용할 것인가 대해서는 Project Settings 에 있는 Active Input Handling을 통해 변경이 가능하다.

float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");

(2) Input.GetAxis / Input.GetAxisRaw

Input.GetAxis()

- 입력을 부드럽게 보간

- 천천히 변화

Input.GetAxisRaw()

- 즉시 입력

- 보정 없음

- 일반적으로 1, 0, 1


4. 이동 벡터 만들기

- 입력 값을 이용해 이동 방향을 만든다.

Vector3 move = new Vector3(horizontal,0,vertical);

(1) 대각선 이동 문제

- 일반적으로, 대각선 쪽의 이동이 더 빠른데 이는 방향 벡터 관점에서 생각하면 이렇다.

- 예를들어 오른쪽 이동과 윗쪽 이동을 동시에 했다고 가정하자.

- 그러면, 이렇게 이동하게 된다. 이때 방향 벡터의 크기가 1.414배가 된다.

- 각각 직선으로 1칸 씩 이동했기 때문에, 빗변은 피타고라스의 정리에 의해 $\sqrt(2)$가 된다.

- 따라서 이러한 대각선 이동에 대한 보정을 해 준다.

move = move.normalized;

normalized → 방향은 유지하고 길이를 1로 보정한다.


5. 기준 공간 (Space)

- Translate는 기준 공간을 지정할 수 있다.

transform.Translate(move,Space.Self);

1) Space.Self

- 현재 오브젝트 기준 이동

transform.Translate(move, Space.World); // → 내가 바라보는 방향

2) Space.World

- 월드 좌표 기준 이동

transform.Translate(move, Space.World); // → 고정된 세계 좌표

float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");

Vector3 move = new Vector3(horizontal, 0, vertical);

move = move.normalized;

transform.Translate(move * moveSpeed * Time.deltaTime);
// 이와 같은 형태로 이동을 구현할 수 있다.

6. 정리

- 이번 내용은 Unity에서 입력값을 받아서 오브젝트를 이동시키는 기본 흐름이다.

- Input.GetAxisRaw()로 입력값을 받고, 그 값을 이용해 Vector3 이동 방향을 만든다. 이때 대각선의 입력은 벡터의 길이가 1보다 커져 이동 속도가 빨라질 수 있으므로, normalized로 보정해야 한다.

- 이후, Time.deltaTime을 곱해 FPS 차이에 따른 이동 속도 차이를 줄이고, Translate()를 사용해 실제 오브젝트를 이동시킬 수 있다.

 
Comments