Unity

(Unity) 유니티에서의 벡터 활용

Janny_ 2022. 8. 21. 16:52

Vector


 

유니티에서 벡터는 게임 오브젝트의 속도와 위치, 방향, 회전, 크기 등 온갖 종류의 계산에 사용됩니다. 따라서 벡터를 이해하는 것은 게임 개발에서 매우 중요합니다. 벡터의 내적을 통해서 두 물체 사이의 각도가 얼마만큼 벌어졌는지, 벡터의 외적을 통해서 어떤 표면에 수직인 방향도 알 수 있습니다.

 

유니티는 Vector2, Vector3, Vector4 타입을 지원합니다. 새로운 벡터값을 만들기 위해서는 다음과 같은 형태로 생성자를 호출합니다.

 

new Vector2(x,y);

new Vector3(x,y,z);

 


예제

Vector3 a = new Vector3(1, 2, 3);

 

//(1, 2, 3)을 (10, 20, 30)으로 수정

a.x = 10;

a.y = 20;

a.z = 30;

 

 


 

이러한 Vector 타입은 유니티 라이브러리의 내부에 클래스가 아닌 구조체로 선언되어 있습니다.

 

public struct Vector3{

       public float x;

       public float y;

       public float z;

       //...Vector3 내부 코드

}

 

구조체는 클래스와 달리 참조 타입으로 동작하지 않고 값 타입으로 동작합니다. 따라서 다음과 같은 코드를 실행했을 때,

 

Vector3 a = new Vector3(0, 0, 0);

Vector3 b = a;

b.x = 100;

 

Vector3가 클래스이자 참조 타입이라면 b를 수정했을 때 a도 수정되겠지만, 구조체이자 값 타입이기 때문에 b를 수정하더라도 a가 수정되지 않습니다. 따라서 코드 실행 후 a와 b 값은 다음과 같습니다.

 

a : (0. 0. 0)

b: (100, 0, 0)

 

 

 

 

벡터 정규화(방향벡터로 만들기)


Unity에서는 다음과 같이 해당 벡터와 방향은 같지만 크기가 1인 방향벡터를 생성할 수 있습니다.

 

Vector3.normalized;

 

예제

Vector3 a = new Vector3(3, 3, 3);

Vector3 b = a.normalized;

 

위와 같이 Vector a의 방향벡터인 Vector b를 생성할 수 있습니다.

 

 

 

벡터의 크기


Unity에서는 다음과 같이 벡터의 크기(길이)를 구할 수 있습니다.

 

Vector3.magnitude;

 

예제

Vector3 a = new Vector3(3, 3, 3);

float b = a.magnitude;

 

위와 같이 Vector a의 크기 b를 구할 수 있습니다.

 

 

벡터의 내적


Unity에서는 다음과 같이 벡터 b를 벡터 a로 투영한 길이(내적)를 구할 수 있습니다.

 

Vector3.Dot(a,b);

 

예제

Vector3 a = new Vector3(0, 1, 0); //위쪽으로 향하는 벡터

Vector3 b = new Vector3(1, 0, 0); //오른쪽으로 향하는 벡터

float c = Vector3.Dot(a,b); //수직인 벡터끼리 내적하면 결과는 0

 

 

 

 

벡터의 외적


Unity에서는 다음과 같이 두 벡터 모두에 수직인 벡터를 구할 수 있습니다.

 

Vector3.Cross(a,b);

 

예제

Vector3 a = new Vector3(0, 0, 1); // 앞쪽(Z) 방향벡터

Vector3 b = new Vector3(1, 0, 0); // 오른쪽(X) 방향벡터

Vector3 c = Vector3.Cross(a, b); //외적 결과 c는 앞쪽과 오른쪽에 수직인 위쪽(Y) 방향벡터

// c = (0, 1, 0)

 

 

 

 

Vector3 응용 예제


두 지점 사이의 거리 구하기

 

예제

Vector3 currentPos = new Vector3(1, 0, 1); // 현재 위치

Vector3 destPos = new Vector3(5, 3, 5); // 목적지

 

// currentPos에서 destPos로 향하는 벡터 delta

Vector3 delta = destPos - currentPos;

 

// currentPos에서 destPos까지의 거리(크기)

float distance = delta.magnitude;

 

그리고 두 벡터 사이의 거리를 계산하는 Distance() 메서드가 Vector3 타입에 내장되어 있기 때문에 다음과 같이 나타낼 수도 있습니다.

 

float distance = Vector3.Distance(currentPos, destPos);

 

 

 

현재 위치에서 목적지를 향하는 방향

 

예제

// 현재 위치에서 목적지를 향해 10만큼 이동한 위치 구하기

 

Vector3 currentPos = new Vector3(1, 0, 1); // 현재 위치

Vector3 destPos = new Vector3(5, 3, 5); // 목적지

 

// currenPos에서 desPos로 향하는 방향벡터 direction

Vector3 direction = (destPos - currentPos).normalized

 

//목적지를 향해 10만큼 현재 위치에서 이동한 새로운 위치

Vector3 newPos = currentPos * direction * 10;

 

 

 

 

 

 

 

 

<참고>

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