게임/고도엔진 문법

27. [고도 엔진] 2D/3D 공간의 이해: 벡터(Vector2, Vector3) 기초

밀감감 2026. 7. 15. 12:00
반응형

 

이 카테고리는 고도 엔진(Godot Engine) 관련 문법을 기록하고 저장하기 위해 만든 공간입니다.

 

이번에는 학교 수학 시간에 '벡터'라는 단어를 듣고 머리가 아팠던 기억이 있으신가요? 걱정하지 마세요! 게임 개발에서의 벡터는 복잡한 수학 공식이라기보다는, 게임 세상 속에서 노드들이 어디에 있는지(위치), 어디로 가고 있는지(방향), 그리고 얼마나 빨리 가고 있는지(속도)를 나타내는 '화살표'라고 생각하면 아주 쉽습니다.

고도 엔진에서 2D 게임을 만들 때는 Vector2, 3D 게임을 만들 때는 Vector3를 사용합니다. 캐릭터를 움직이기 위해 반드시 알아야 하는 벡터의 기초와 핵심 활용법을 정리해 보겠습니다.

1. 벡터의 기본: 좌표계와 위치 (x, y, z)

벡터는 단순히 숫자들의 묶음입니다. 2D 게임에서는 가로(x)와 세로(y) 두 개의 숫자가 필요하므로 Vector2를 쓰고, 3D 게임에서는 깊이(z)까지 추가되어 Vector3를 씁니다.

 

주의 (고도 엔진 2D의 특징): 수학 시간이나 일반적인 그래프에서는 y축이 위로 갈수록 숫자가 커지지만, 고도 엔진의 2D 화면에서는 아래로 내려갈수록 y값이 커집니다 (+y). 반대로 위로 올라가려면 y값을 빼주어야 합니다 (-y).

GDScript
 
func _ready():
    # 1. 2D 벡터 생성: x좌표 100, y좌표 50인 위치
    var player_pos = Vector2(100, 50)
    print("X 좌표: ", player_pos.x, ", Y 좌표: ", player_pos.y)
    
    # 2. 엔진에서 자주 쓰는 방향은 미리 상수로 만들어져 있습니다.
    var up_dir = Vector2.UP    # Vector2(0, -1) 과 동일
    var right_dir = Vector2.RIGHT # Vector2(1, 0) 과 동일
    
    # 3. 3D 공간이라면 z축이 추가됩니다.
    var box_pos3d = Vector3(10, 5, -2)

2. 벡터의 덧셈과 뺄셈: 이동과 목표물 추적

게임에서 벡터끼리 더하거나 빼는 것은 일상입니다. 현재 위치에 속도를 더하면 '이동'이 되고, 목표물의 위치에서 내 위치를 빼면 '목표를 향하는 방향'이 나옵니다. 특히 '도착점 - 출발점 = 방향'이라는 공식은 유도 미사일을 만들거나 적을 쳐다보게 만들 때 무조건 쓰이는 마법의 공식입니다.

GDScript
 
# 1. 벡터의 덧셈 (이동)
func _process(delta):
    var velocity = Vector2(100, 0) # 오른쪽으로 100만큼의 속도
    
    # 내 현재 위치에 속도를 더해 캐릭터를 오른쪽으로 이동시킵니다.
    position += velocity * delta 

# 2. 벡터의 뺄셈 (방향 구하기)
func get_direction_to_enemy(enemy_position: Vector2):
    # 공식: 도착점(적 위치) - 출발점(내 위치)
    var direction_vector = enemy_position - self.global_position
    
    # 이 벡터는 나침반처럼 적이 있는 곳을 가리키는 화살표가 됩니다.
    return direction_vector

3. 마법의 함수들: normalized, length, distance_to

벡터를 자유자재로 다루기 위해 고도 엔진이 제공하는 강력한 내장 함수 3대장입니다.

  • length() (길이): 화살표의 길이를 구합니다. 게임에서는 주로 '현재 내 캐릭터의 이동 속력'이 얼마인지 확인할 때 씁니다.
  • normalized() (정규화): 화살표의 방향은 그대로 유지한 채, 길이만 1로 압축합니다. 대각선으로 이동할 때 가로/세로 이동보다 1.4배 빨라지는 버그를 막기 위해 반드시 사용해야 합니다.
  • distance_to() (거리): 나와 목표물 사이의 실제 직선거리를 구합니다. "사정거리 안에 적이 들어왔는가?"를 판별할 때 쓰입니다.
GDScript
 
func move_and_check(target_pos: Vector2):
    # 1. 입력받은 방향을 정규화하여 대각선 이동 시 속도가 빨라지는 것을 방지합니다.
    var move_dir = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
    
    # get_vector()는 이미 정규화되어 있지만, 직접 만들 땐 아래처럼 해야 합니다.
    # var raw_dir = Vector2(1, 1) # 대각선 입력 (길이가 약 1.414)
    # var safe_dir = raw_dir.normalized() # 길이를 1.0으로 고정
    
    # 2. 적과의 거리 계산 (사정거리 확인)
    var distance = self.global_position.distance_to(target_pos)
    
    if distance < 50.0:
        print("적이 사정거리 50 안에 들어왔습니다! 공격!")

한눈에 보는 벡터(Vector) 핵심 요약

개념 / 함수 의미와 기능 실전 게임 개발 활용 예시
Vector2(x, y) 2D 공간의 x(가로), y(세로) 좌표 또는 화살표 2D 캐릭터의 화면상 위치, 총알이 날아가는 속도와 방향
Vector3(x, y, z) 3D 공간의 x(가로), y(높이), z(깊이) 좌표 3D 몬스터의 스폰 위치, 카메라가 바라보는 각도
도착점 - 출발점 (목표 위치) - (내 위치)를 빼서 방향 벡터 계산 플레이어를 쫓아오는 좀비의 이동 방향, 총구에서 마우스를 향하는 방향
length() 벡터(화살표)의 길이를 실수(float)로 반환 차의 현재 속력 계기판 표시, 화살이 날아가는 힘 계산
normalized() 방향은 유지하고 길이를 1.0으로 고정(정규화) 8방향 이동 시 대각선에서 속도가 비정상적으로 빨라지는 현상 방지
distance_to(목표) 현재 위치에서 목표 위치까지의 직선거리 계산 타워 디펜스에서 타워 사거리 내에 몬스터가 진입했는지 감지
반응형