Unity

(Unity) 벡터 연산으로 평행이동 구현하기, transform

Janny_ 2022. 8. 26. 16:15

벡터의 속기


Vector3 타입에는 '속기'라는 미리 만들어진 편리한 변수들이 있습니다. 자주 사용되는 Vector3 값은 속기를 사용해 다음과 같은 형태로 즉시 생성할 수 있습니다.

 

예제

Vector3 position = Vector3.up;

 

위 코드는 Vector3 position = new Vector3(0, 1, 0);과 같은 동작을 합니다.

 

https://step-forward.tistory.com/10?category=956734 (벡터의 활용 포스팅)

이전 벡터의 활용 포스팅에서 벡터값을 생성할 때 new Vector3(x, y, z)과 같은 형태의 생성자를 만든다고 했는데, 벡터의 속기를 활용하여 편하게 자주 사용되는 Vector3 값을 생성할 수 있습니다.

 

 

Vector3의 속기

 

Vector3.forward : new Vector3(0, 0, 1);

Vector3.back : new Vector3(0, 0, -1);

Vector3.right : new Vector3(1, 0, 0);

Vector3.left : new Vector3(-1, 0, 0);

Vector3.up : new Vector3(0, 1, 0);

Vector3.down : new Vector3(0, -1, 0);

 

이들은 모두 크기가 1인 방향벡터라는 점에 유의해야 합니다.

 

 

 

Transform 의 방향


 

트랜스폼 컴포넌트를 표현하는 Transform 타입은 자신의 앞, 뒤, 오른쪽 등을 나타내는 방향벡터를 즉시 접근할 수 있는 변수들을 제공합니다.

 

Transform 타입의 방향


transform.forward : 자신의 앞쪽을 가리키는 방향벡터

transform.right : 자신의 오른쪽을 가리키는 방향벡터

transform.up : 자신의 위쪽을 가리키는 방향벡터

 

여기서 뒤쪽, 왼쪽, 아래쪽에 관한 변수는 따로 없지만 -1을 곱하여 각각 표현할 수 있습니다.

 

 

 

 

Translate() 메서드를 통한 평행이동


평행이동은 Transform 타입이 제공하는 Translate() 메서드를 통해 실행할 수 있습니다. Translate() 메서드에 의한 평행이동은 전역 공간이 아니라 지역 공간을 기준으로 이루어집니다. 예를 들어 transform.Translate(0, 0, 1);을 실행하면 자신의 앞쪽(z) 방향으로 1만큼 움직이지만, 게임 월드의 앞쪽과는 다른 방향으로 움직일 수 있게 됩니다.

 

하지만 원한다면 평행이동 기준을 전역 공간으로 선택할 수 있습니다.

 

예제

transform.Translate(new Vector3(0, 1, 0), Space.World); //전역 공간 기준 평행이동

transform.Translate(new Vector3(0, 1, 0), Space.Self); //지역 공간 기준 평행이동

 

예제처럼 Translate() 메서드는 두 번째 값으로 Space 타입을 받아 평행이동의 기준을 전역 공간(Space.World)으로 할 지, 지역 공간(Space.Self)으로 할 지 지정할 수 있습니다.

 

 

마지막으로 벡터의 속기와 Translate() 메서드를 활용한 내용을 정리해보면 다음과 같습니다.

 

예제

transform.Translate(new Vector3(0, 1, 0)); //게임 오브젝트가 지역 공간을 기준으로 (0, 1, 0)만큼 평행이동하는 코드

transform.position = transform.position + transform.up * 1; // 위 코드와 동일한 표현

 

// 게임 오브젝트가 전역 공간을 기준으로 (0, 1, 0)만큼 평행이동하는 코드

transform.Translate(new Vector3(0, 1, 0), Space.World);

// 위 코드와 동일한 표현

transform.position = transform.position + Vector.up * 1;

 

 

 

 

 

 

 

 

<참고>

레트로의 유니티 게임 프로그래밍 에센스