[Unity] 벡터

AsiaticRicecake·2026년 6월 13일

📖 1. 벡터 개념

벡터는 "방향(Direction) + 크기(Magnitude)" 개념이 있는 물리량입니다.

밑에 그림을 참고하면 더 쉽게 이해하실 수 있습니다

Vector3 vector = new Vector3(3,0,0)

유니티에서는 벡터를 이렇게 나타내는데 "오른쪽 방향으로 3만큼"의 의미가 있습니다


📖 2. 벡터의 덧셈

🔖 2-1. 벡터의 덧셈

현재 플레이어의 위치가 여기있다고 가정할게요

Vector3 pos = new Vector3(5,0,0)

여기서 오른쪽으로 2칸 이동하고 싶다고 했을때

Vector3 move = new Vector3(2, 0, 0);

이런 식으로 더해서 이동할 수 있겠죠

pos = pos + move

🔖 2-2. Unity에서 활용

게임 개발할 때 밑의 예시처럼 사용하는 경우는 별로 없습니다

transform.position += Vector3.forward;

Vector3.forward이건 앞으로 이동 즉 Z축 +로 이동하는 겁니다
기본값은 (0,0,1)로 고정되어있습니다.

그래서 이동을 구현할 때 speed라는 변수를 선언해서 곱해서 사용하는 겁니다(여기서 벡터의 곱이 사용되는 겁니다)

public float speed = 5f;

transform.position += Vector3.forward * speed;

🤔 2-2-1. 이동 구현 시 소수점으로 표현하는 이유?

이동 구현할 때 float(부동소수점)를 사용하는 이유를 생각해볼까요?

int를 사용하면 정수이기 때문에 소수점이 잘려서 움직임이 끊기거나 아예 움직이지 않을 수도 있습니다

프레임이 60FPS라고 가정하면 Time.deltaTime0.016인데

int move = (int)(5 * Time.deltaTime);
(int)0.08

이렇게 되면 0으로 나와서 움직이지 않다가 계속 계산되면서 갑자기 움직이고 그런 식으로 끊기게 됩니다.

그래서 float을 사용하여 소수점 단위 위치 표현해야 부드러운 이동 가능하도록 만드는 것입니다.


📖 3. 벡터의 뺄셈

벡터의 뺄셈은 정말 중요한 개념입니다.
게임에 정말 많이 응용되는 개념이라 무조건 알고 계셔야 합니다

한 오브젝트에서 다른 오브젝트까지의 거리와 방향을 구하고자 할 때 사용되는 계산 방식입니다.

🔖 3-1. 벡터의 뺄셈

내 위치를 (2,0,0)라고 하고 적 위치를 (8,0,0)라고 한다면 나 기준으로 오른쪽 6만큼 가면 적이 있다는 의미가 됩니다.

유니티에서 코드로 표현한다면 대략 이런 코드로 되겠네요

Vector3 direction = target.position - transform.position;

이 부분을 응용하면 AI 추적, 유도 미사일, 카메라 추적, 플레이어 따라오기 등 정말 많은 기능을 구현할 수 있습니다

물론 유니티에서는 굳이 코드로 구현을 안해도 시네머신, NevMesh등 으로 카메라 추적이나 AI 추적 구현은 가능하긴 한데 기본적인 원리는 벡터의 뺄셈을 통해 한 오브젝트에서 다른 오브젝트까지의 거리와 방향을 계산하여 만드는 겁니다.


📖 4. Unity의 벡터 타입

위에서도 잠시 예시 코드로 보여줬지만 게임에서 많이 사용하는 Vector 타입은 Vector2, Vector3입니다.

Vector4도 있긴 한데 거의 사용하지 않습니다.

타입의미사용처
Vector2x, y2D 게임, UI
Vector3x, y, z3D 게임
Vector4x, y, z, w쉐이더, 특수 계산

🔖 4-1. Vector2

2차원 좌표입니다. x = 좌우, y = 상하로 구분하고 있습니다
당연히 2D로 사용하는 부분에서 해당 벡터가 사용이 되겠죠?

Vector2 pos = new Vector2(10, 5);

🔖 4-2. Vector3

3차원 좌표입니다. x = 좌우, y = 위아래, z = 앞뒤로 구분합니다
Vector3는 이미 위에서 많이 설명을 드린 개념이고 Unity에 Vector 관련된 문법 대부분이 Vector3라고 생각하시면 됩니다

transform.position

transform.forward

transform.right
Vector3 pos = new Vector3(1, 2, 3);

🔖 4-3. Vector2Int / Vector3Int

벡터 뒤에 Int가 있는 타입도 있습니다.
Vector2 / Vector3의 경우 float 기반 벡터라 소수점 표현 가능해서 위치, 이동, 속도 등에 사용하기에 적합하지만 타일, 슬롯, 격자 등 소수형이 맞지 않는 경우가 있습니다. 그래서 int 기반 벡터를 지원합니다

Vector2Int tilePos = new Vector2Int(3, 5);

타일맵, 그리드, 인벤토리 칸 좌표 등 좌표가 칸 단위로 정확히 떨어져야 할 때 사용하는 개념입니다.


📖 5. 벡터의 크기(magnitude)

지금까지 벡터의 기본에 대하여 알이봤는데 조금 세부적으로 이해를 할 필요가 있습니다

magnitude는 벡터의 크기(길이)입니다.

Vector3 v = new Vector3(5, 0, 0);

여기서 해당 코드 의미는 오른쪽 방향 + 길이 5이며, 5가 magnitude가 되는 것입니다

🔖 5-1. Distance()

추가로 알 필요가 있는 문법이 Distance()입니다.
해당 위치의 거리를 구할 수 있는 메서드입니다

float distance = Vector3.Distance(transform.position,target.position);

📖 6. normalized(단위 벡터)

단위 벡터 개념 정말 중요하고 많이 쓰입니다

벡터의 방향은 유지하고 길이(magnitude)를 1로 만드는 것

Vector3 dir = new Vector3(10, 0, 0);

이 벡터는 오른쪽 방향 + 길이 10을 의미합니다

여기서 정규화를 진행한다면

Vector3 result = dir.normalized;

(1, 0, 0)

방향은 그대로 유지하고 길이를 10 → 1로 변경하는 겁니다

🔖 6-1. 왜 굳이 길이를 1로 만들까요

추격 시스템을 만든다고 가정해볼게요.

✔️ 6-1-1. 현재 위치

플레이어(10,0,0)
몬스터 (0,0,0)

✔️ 6-1-2. 방향 구하기

Vector3 dir = player.position - monster.position;
(10,0,0)

이 상태로 이동해버린다면

transform.position += dir;

한 프레임에 10칸 이동해버리는 이상한 현상이 나타납니다.

direction의 크기가 거리 자체이기 때문에 플레이어가 멀수록 direction의 크기가 커져서 빠르게 이동하는 겁니다

그래서 normalized 사용하여 길이를 1로 만드는 것입니다

Vector3 dir = (player.position - monster.position).normalized;

플레이어가 10m 떨어져 있든 100m 떨어져 있든 속도가 동일해야 하는 것이 핵심입니다.


📖 7. Dot Product(내적)

두 벡터가 얼마나 같은 방향을 보고 있는가를 나타내는 개념으로 시야각 만들 때 사용합니다

몬스터가 보는 방향과 플레이어 방향이 거의 비슷하면 발견하는 겁니다.
길이는 무시하고 방향만 비교하기 위해 normalized를 사용합니다.


📖 8. Cross Product(외적)

내적이 "얼마나 같은 방향인가"를 숫자 하나로 표현하는거면, 외적은 두 벡터에 수직인 새 벡터를 만드는 개념입니다

|A×B| = |A| × |B| × sin(θ)

🔖 8-1. 평행(0°/180°)이면 sin=0 → 외적 = 0

외적 수평

🔖 8-2. 수직(90°)이면 sin=1 → 외적 최대

외작 수직

기하학적으로는 두 벡터가 만드는 평행사변형 넓이라고 이해하시면 됩니다

🔖 8-3. 게임에서 활용

앞에서 외적은 현재 방향에서 다른 방향의 벡터를 새로 만드는 개념이라고 했잖아요?

플레이어가 앞을 보고 있을 때 오른쪽 방향을 추가로 구한다고 생각해봅시다

transform.forward를 알고 있지만 transform.right는 모르는 상황입니다

Vector3 right = Vector3.Cross(transform.up,transform.forward);

이런 식으로 외적 계산하여 오른쪽 방향을 알 수 있습니다

가장 많이 사용되는 건 조명, 그림자, 반사 계산입니다.

✔️ 8-3-1. 삼각형 두 변(edge)을 구한다

3D Mesh는 삼각형으로 이루어져 있습니다. 꼭짓점 A, B, C가 있으면

Vector3 edge1 = B - A;  // A에서 B로 가는 벡터
Vector3 edge2 = C - A;  // A에서 C로 가는 벡터

✔️ 8-3-2. 두 변을 외적해서 법선을 구한다

이 두 변을 외적하면 이 삼각형 면이 바라보는 방향이 나오는데 이게 법선(Normal)입니다. 삼각형 위에 딱 수직으로 솟아있는 벡터가 나오는 거죠

Vector3 normal = Vector3.Cross(edge1, edge2).normalized;

✔️ 8-3-3. 법선과 빛 방향을 내적해서 밝기를 구합니다

float brightness = Vector3.Dot(normal, lightDir);
// 1.0  → 빛이 면을 정면으로 비춤 → 가장 밝음
// 0.0  → 빛이 면과 평행 → 경계선
// -1.0 → 면이 빛을 등짐 → 어두움

외적은 "이 면이 어느 방향을 보고 있냐"를 알아내는 데 쓰이고, 그걸 구한 다음에 내적으로 빛을 구하는 겁니다. 외적 없이는 법선을 못 구하니까 조명 계산 자체가 불가능합니다

상당히 복잡한데 다행히 실제 개발할 때 외적을 직접 사용하여 게임을 구현하는 경우는 많지 않습니다. 그런 상황이 있다고 해도 Unity 자체에서 계산(빛, 그림자 계산)해주는 기능이 많아서 코드에 직접 사용하는 경우는 정말 드뭅니다.

0개의 댓글