(Unity) 유니티에서의 벡터 활용
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;
<참고>
레트로의 유니티 게임 프로그래밍 에센스