Unity_03 Transform, Frame, Input Class

SeonggyuMin·2025년 4월 16일

Unity

목록 보기
2/11

1. Transform

Transform이란 게임오브젝트의 위취, 회전, 크기를 저장하는 컴포넌트이다.

1. 트랜스폼 접근 - transform

transform : 게임오브젝트에 있는 Transform 컴포넌트에 접근할 수 있다.

thisTransform = transform;

2. 트랜스폼 이동 - Translate()

Translate : 트랜스폼 이동 함수

// 1. 절대 위치로 이동
transform.position = new Vector3(1, 2, 3);

// 2. 방향 벡터를 이용한 이동
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);

// 3. 목적지로 일정 속도로 이동시키기
transform.position = Vector3.MoveTowards(
	transform.position, 
	target.position, 
	moveSpeed * Time.deltaTime
);

// 4. 보간해서 부드럽게 이동시키기 Lerp = Linear Interpolation, 선형보간
transform.position = Vector3.Lerp(
	source.position, 
	target.position, 
	rate
);

// 5. 축 기준 이동
transform.Translate(0, 0, moveSpeed * Time.deltaTime);

// 6. 포지션을 직접 더해서 이동
transform.position += new Vector3(0, 0, moveSpeed * Time.deltaTime);
  1. 절대 위치로 이동시키기 (위치 설정): 오브젝트를 특정 좌표로 즉시 이동시킴
  2. 방향 벡터를 이용한 이동 : 현재 오브젝트의 앞 방향 기준으로 이동 (회전 반영됨), (로컬 기준)
  3. 목적지로 일정 속도로 이동시키기: 도착 지점까지 일정 속도로 직선 이동, 경로 계산 필요 없음
  4. 보간해서 부드럽게 이동시키기: 처음에 빨랐다가 느려지는 비등속 이동
  5. 축 기준 이동: 단순히 해당 축으로 이동(회전 반영됨), (로컬 기준)
  6. 포지션을 직접 더해서 이동: 해당 축 월드 방향으로 이동(회전 반영 X), (월드 기준)

트랜스폼 이동 기준 설정

// 1. 월드를 기준으로 이동
transform.Translate(0, 0, 1, Space.World);

// 2. 로컬을 기준으로 이동
transform.Translate(0, 0, 1, Space.Self);

// 3. 다른 대상을 기준으로 이동
transform.Translate(0, 0, 1, otherTransform);
  1. 월드를 기준으로 이동: 세계 좌표(Z축) 기준으로 이동, 회전과 상관 없이 이동
  2. 로컬을 기준으로 이동: 로컬 좌표(Z축) 기준으로 이동, 회전에 따라 이동
  3. 다른 대상을 기준으로 이동: 다른 오브젝트를 기준으로 이동, 다른 오브젝트의 회전에 따라 이동

3. 트랜스폼 회전 - Rotate()

Rotation은 (x, y, z)를 직접 사용하지 않고 Quaternion을 사용한다.
짐벌락 현상이 발생하기 때문이다.
2개 이상의 축이 겹치면서 한 방향으로는 더 이상 회전불가한 상황이 나온다.

쿼터니언 값은 직접 지정해서 넣기 매우 어렵다. 따라서 오일러 각으로 변환해서 넣을 수 있는 메서드가 있다.

// 1. 회전 직접 지정: Euler 각을 이용하여 회전각을 직접 대입
transform.rotation = Quaternion.Euler(0, 60, 0);

// 2. 축을 기준으로 회전
transform.Rotate(Vector3.up, rotateSpeed * Time.deltaTime); // y축을 기준으로 1초 당 rotateSpeed만큼 회전

// 3. 지점을 기준으로 회전
transform.RotateAround(
	target.position, 
	Vector3.up, 
	rotateSpeed * Time.deltaTime
);

// 4. 지점을 바라보도록 회전
transform.LookAt(target.position);

// 5. Lerp
transform.rotation = Quaternion.Lerp(
    transform.rotation,
    Quaternion.LookRotation(targetDir),
    Time.deltaTime * turnSpeed
);

// 6. Slerp
transform.rotation = Quaternion.Slerp(
    transform.rotation,
    Quaternion.LookRotation(targetDir),
    Time.deltaTime * turnSpeed
);

// 1-1 오일러 각을 쿼터니언으로 변환
Quaternion a = Quaternion.Euler(0, 60, 0); // Vector3도 됨
// 1-2 쿼터니언을 오일러로 변환
Vector3 b = transform.rotation.eulerAngles;
// 1-3 방향벡터를 쿼터니언으로 변환
Quaternion c = Quaternion.LookRotation(Vector3.right);
// 1-4 현재 회전을 방향벡터로 변환
Vector3 d = transform.right;
  1. 회전 직접 지정: Euler 각을 이용하여 회전각을 직접 대입: 즉시 그 방향으로 회전, 기존 회전에 덧붙이는 것이 아닌 대입
  2. 축을 기준으로 회전: 현재 회전에 누적 회전 (Space.Self 가 기본, Space.World 추가 가능)
  3. 지점을 기준으로 회전: 궤도 이동 처럼 이동
  4. 지점을 바라보도록 회전: 오브젝트가 지정된 타겟을 향해 즉시 방향 전환(빠른 시선 이동 같음)
  5. Lerp: 타겟 방향으로 비등속 회전
  6. Slerp: 타겟 방향으로 등속 회전
// 1. 월드를 기준으로 회전
transform.Rotate(0, 0, 1, Space.World);

// 2. 로컬을 기준으로 회전
transform.Rotate(0, 0, 1, Space.Self);

// 3. 위치를 기준으로 회전
transform.RotateAround(otherTransform.position, Vector3.up, 1);
  1. 월드를 기준으로 회전: 세계 축(Z축) 기준으로 회전, 오브젝트 회전과 상관 없이 회전
  2. 로컬을 기준으로 회전: 로컬 축(Z축) 기준으로 회전, 오브젝트 회전에 따라 축도 함께 회전, 누적 회전
  3. 위치를 기준으로 회전: otherTransform을 중심으로, Y축을 기준으로 회전, 오브젝트가 공전하면서 이동 회전

4. 월드 스페이스, 로컬 스페이스

월드 스페이스(World Space):

  • 게임 환경 내의 고정된 글로벌 좌표계를 의미하며, 절대 좌표라고도 한다.
  • 이 좌표계는 게임의 시작부터 끝까지 변하지 않으며, 모든 오브젝트들이 이 월드 스페이스 내에서 위치를 가지게 된다.
  • 월드 스페이스에서의 오브젝트의 위치, 회전, 크기는 월드 포지션(World Position), 월드 회전(World Rotation), 월드 스케일(World Scale)로 표현된다.

로컬 스페이스(Local Space):

  • 오브젝트나 컴포넌트의 개별적인 좌표계를 의미하며, 상대 좌표라고도 한다.
  • 특히 부모-자식 관계에서 중요하며, 자식 오브젝트의 로컬 스페이스는 부모 오브젝트에 대해 상대적이다. (자식 오브젝트의 로컬 포지션이 (0, 0, 0)이라면, 부모 오브젝트의 위치와 동일하다는 뜻)
  • 로컬 스페이스에서의 오브젝트의 위치, 회전, 크기는 로컬 포지션(Local Position), 로컬 회전(Local Rotation), 로컬 스케일(Local Scale)로 표현된다.

2. 프레임(Frame)

  • 프레임: 각각의 정지 게임 상황을 프레임이라 한다.

  • FPS(Frame per Second): 1초 동안 표현한 프레임 수

  • 단위 시간: 1프레임 동안 소모한 시간
    - DeltaTimeDeltaTime == 1FPS\frac{1}{FPS}
    - deltaTimeUpdate() 직전에 갱신된다

  • 시간동기화
    - 게임의 FPS은 가변적이며 확정되어 있지 않다.
    - 다양한 요인으로 인해 지연시간 및 처리시간이 발생할 수 있으나 어디서든 동일한 게임 진행이 되어야한다.
    - 단위시간을 이용하면 처리 시간과 무관하게 동일한 게임 진행이 가능하다

게임이 10 FPS일 경우: 110\frac{1}{10} 초마다 110\frac{1}{10} 만큼 처리 => 결과는 1초 동안 1 처리
게임이 XX FPS일 경우: 1X\frac{1}{X} 초마다 1X\frac{1}{X} 만큼 처리 => 결과는 1초 동안 1 처리

private static readonly Vector3 zeroVector = new Vector3(0f, 0f, 0f);

private static readonly Vector3 oneVector = new Vector3(1f, 1f, 1f);

private static readonly Vector3 upVector = new Vector3(0f, 1f, 0f);

private static readonly Vector3 downVector = new Vector3(0f, -1f, 0f);

private static readonly Vector3 leftVector = new Vector3(-1f, 0f, 0f);

private static readonly Vector3 rightVector = new Vector3(1f, 0f, 0f);

private static readonly Vector3 forwardVector = new Vector3(0f, 0f, 1f);

private static readonly Vector3 backVector = new Vector3(0f, 0f, -1f);

Vector3에 단위벡터가 설정되어있어 속도를 곱했을 때 속도만큼 이동할 수 있게된다.

3. Input Class, Input Manager

1. Input Class

Input Class는 유니티에서 사용자의 명령을 감지할 수 있는 수단이며 이를 통해 사용자는 다양한 외부 장치(키보드 및 마우스, 조이스틱, 등)를 이용하여 게임을 제어할 수 있다.

Input.GetKey(KeyCode.W);
  • GetKey() 메서드는 KeyCode(열거체)를 매개변수로 갖는다.
1. GetKey()

키보드 & 게임패드
GetKey(): 누르고 있는 동안 true
GetKeyDown(): 눌렀을 때 한 번만 true
GetKeyUp(): 뗐을 때 한 번만 true

마우스
GetMouseButton(): 누르고 있는 동안 true
GetMouseButtonDown(): 눌렀을 때 한 번만 true
GetMouseButtonUp(): 뗐을 때 한 번만 true

2. GetAxis()
  • 유니티에서 제공하는 Input Manager에 대응하는 코드이다. 유니티 좌표상의 X(Horizontal), Z(Vertical)축에 해당하는 입력 데이터이며, 미 입력시 0, 방향과 입력에 따라 -1.0 ~ 1.0 사이의 float 타입을 반환한다.
3. GetAxisRaw()
  • GetAxis와 마찬가지로 Input Manager에 대응하지만 입력 데이터를 -1, 0, 1로 반환한다.

2. Input Manager

Input Manager란 Unity 에디터에서 키보드, 마우스, 게임패드 등의 입력 키와 축(Axis)을 사전에 설정해두는 입력 설정 도구이다.

위의 한 키에 한 코드를 매칭하는 방식으로는 여러 키와 플랫폼에 대한 대응은 어려울 수 있다.
그러나 Input Manager에서는 이름과 입력을 정의하고 묶어서 관리할 수 있기에 아래의 방법처럼 사용할 수 있다.

if (Input.GetButtonDown("Fire1"));
{
	//...
}

Fire1에 대응하는 키들을 매핑함으로써 소스코드 한 개로 여러 키를 대응시킬 수 있으며, 가독성에도 도움이 된다.
하지만 유니티 초창기의 방식이기 때문에, 키보드, 마우스, 조이스틱에 대한 장치만을 고려하여 최신 기기들에 대해서는 지원하지 않는다.

Input Manager 설정 방법

  • Main Menu(좌상단) - Edit - Project Settings - Input Manager

<InputSystem>
InputSystem 패키지를 이용한 입력방식이다.
컴포넌트를 통해 입력의 변경사항을 확인 및 최신에 지원한 방식으로 다양한 기기를 지원한다.

0개의 댓글