벡터 기초
3강. 벡터 기초
1. 이번 강의에서 해결할 문제
FVector를 모두 위치라고 생각해 방향 벡터에도 월드 좌표를 더하고, 속도와 한 프레임 이동량을 혼동합니다. 같은 자료형이 나타내는 물리적 의미를 문맥으로 구분합니다.
2. 학습 목표
3. 핵심 개념
FVector(X, Y, Z)는 세 숫자의 묶음이지만 의미와 단위는 변수 이름과 연산이 정합니다.
| 이름 | 예 | 의미·단위 |
|---|---|---|
| Position | PlayerLocation | 월드 원점에서 위치, cm |
| Displacement | Target - Enemy | 적에서 목표까지 변화량, cm |
| Direction | Displacement 정규화 | 방향만, 단위 없음 |
| Velocity | Direction × Speed | 초당 이동량, cm/s |
위치 두 개를 더하는 것은 대부분 의미가 없지만, 위치에서 위치를 빼면 변위가 됩니다. 방향과 속도를 구분하면 프레임 시간 적용 위치도 명확해집니다.
먼저 알아야 할 수학 언어
- 스칼라: 방향 없이 크기만 있는 숫자입니다. 속력
600cm/s, 체력100, 거리500cm가 예입니다. - 벡터: 크기와 방향을 함께 표현하는 숫자 묶음입니다.
(300, 400, 0)은 X로 300, Y로 400만큼 향하는 변위입니다. - 크기: 벡터의 길이입니다.
FVector::Size()로 구하며(300, 400, 0)의 크기는 피타고라스 정리에 따라500입니다. - 정규화: 방향은 유지하고 크기를 1로 만드는 과정입니다. 0 벡터는 방향이 없으므로 안전한 API와 작은 크기 검사가 필요합니다.
같은 FVector 타입이라도 단위가 다를 수 있습니다. 위치와 변위는 보통 cm, 속도는 cm/s, 정규화한 방향은 단위가 없습니다. 변수 이름에 Location, ToTarget, Direction, Velocity를 구분해 쓰면 실수로 속도에 시간을 두 번 곱하거나 위치끼리 더하는 오류를 줄일 수 있습니다.
4. 단계별 실습
C++ · 파일 경로: Source/TopDownSurvival/AI/VectorVisualizer.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "VectorVisualizer.generated.h"
UCLASS()
class TOPDOWNSURVIVAL_API AVectorVisualizer : public AActor
{
GENERATED_BODY()
public:
AVectorVisualizer();
protected:
virtual void BeginPlay() override;
UPROPERTY(EditInstanceOnly, Category = "Math")
TObjectPtr<AActor> TargetActor;
};
C++ · 파일 경로: Source/TopDownSurvival/AI/VectorVisualizer.cpp
#include "AI/VectorVisualizer.h"
#include "DrawDebugHelpers.h"
AVectorVisualizer::AVectorVisualizer()
{
PrimaryActorTick.bCanEverTick = false;
}
void AVectorVisualizer::BeginPlay()
{
Super::BeginPlay();
if (!IsValid(TargetActor)) return;
const FVector Start = GetActorLocation();
const FVector End = TargetActor->GetActorLocation();
const FVector ToTarget = End - Start;
UE_LOG(LogTemp, Display,
TEXT("ToTarget=%s Length=%.1fcm"), *ToTarget.ToString(), ToTarget.Size());
DrawDebugDirectionalArrow(
GetWorld(), Start, End, 80.0f, FColor::Cyan, true, 10.0f, 0, 4.0f);
}
코드 한 줄씩 이해하기
- 이 시각화는 시작할 때 한 번만 필요하므로 생성자에서 Tick을 끕니다.
IsValid(TargetActor)는 Inspector 참조가 없거나 이미 파괴된 Actor인 경우 후속 접근을 막습니다.Start와End는 각각 시각화 Actor와 목표 Actor의 위치입니다.End - Start는 시작점에서 끝점으로 향하는 변위입니다. 빼는 순서를 바꾸면 크기는 같지만 방향은 반대입니다.ToTarget.Size()는 변위의 크기, 즉 두 Actor 사이의 3차원 거리를 반환합니다.DrawDebugDirectionalArrow는 Start에서 End까지 Cyan 화살표를 10초 동안 그려 숫자와 공간 방향을 함께 검증하게 합니다.
Start가 (0, 0, 0), End가 (300, 400, 0)이면 로그의 핵심 값은 다음과 같아야 합니다.
ToTarget=X=300.000 Y=400.000 Z=0.000 Length=500.0cm
Unreal 버전에 따라 FVector::ToString()의 공백이나 소수점 표시는 조금 다를 수 있지만 세 성분과 길이는 같아야 합니다.
Unreal Editor에서 가장 작은 확인
- C++ 컴파일 후
AVectorVisualizer의 Blueprint 자식을 만들고 레벨 원점에 배치합니다. - Target으로 사용할 빈 Actor 또는 플레이어를
(300, 400, 0)에 배치합니다. - VectorVisualizer의 Details에서 Target Actor 슬롯에 그 Actor를 지정합니다.
- Play 후 Output Log에서
Length=500.0cm에 가까운 값을 확인하고, Cyan 화살표가 시각화 Actor에서 목표를 향하는지 봅니다. - 참조를 일부러 비운 경우 크래시나 로그가 발생하지 않고 조용히 반환하는 현재 정책도 확인합니다. 실제 프로젝트에서는 누락 참조 경고를 추가할 수 있습니다.
5. 코드와 수학·AI가 동작하는 이유
목표 위치 T에서 적 위치 E를 빼면 D = T - E가 적에서 목표로 향하는 변위가 됩니다. D의 크기 |D|는 거리이고, 다음 강의에서 D를 정규화하면 길이 1인 방향을 얻습니다. Debug Arrow는 추상적인 세 숫자를 공간에서 확인하게 합니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
실습 목표
위치 두 개에서 변위와 거리를 계산하고, 빼기 순서와 Z축 정책이 게임 판정에 주는 영향을 Debug Arrow와 로그로 확인합니다.
시작 전 상태
VectorVisualizer는 (0, 0, 0), TargetActor는 (300, 400, 0)에 두고 Target Actor 참조를 연결합니다. 먼저 손으로 300² + 400² = 500²를 계산합니다.
1단계: 따라 하기
Play해 ToTarget (300, 400, 0), 길이 500과 화살표 방향을 확인합니다. 손 계산·로그·화면 화살표 세 결과가 같은 관계를 보여야 합니다.
2단계: 값 바꿔 보기
TargetActor를 (0, 0, 500)으로 옮깁니다. Size()는 500이지만 탑다운 평면 거리 Dist2D는 0입니다. 어떤 게임 규칙에서 높이를 포함하거나 제외할지 명시해야 하는 이유를 기록합니다.
3단계: 직접 적용
const FVector Reverse = Start - End;를 추가하고 다른 색의 Debug Arrow를 End에서 Start 방향으로 그리세요. ToTarget과 Reverse의 크기는 같고 각 성분의 부호는 반대인지 확인합니다.
4단계: 스스로 확인
막혔을 때
| 증상 | 원인 | 해결 |
|---|---|---|
| Target Actor 슬롯이 안 보임 | C++ 컴파일 실패 또는 다른 Blueprint 부모 | 컴파일 성공과 Blueprint 부모가 AVectorVisualizer인지 확인합니다. |
| 화살표가 반대 방향 | 위치 빼기 순서가 반대 | 목표 위치 - 시작 위치로 ToTarget을 만듭니다. |
| 길이가 예상보다 큼 | Z 높이가 포함됨 | Location 세 성분을 로그로 확인하고 평면 규칙이면 Dist2D를 검토합니다. |
| 화살표가 계속 쌓임 | 반복 호출과 긴 지속 시간 | 이번 예제처럼 BeginPlay 한 번만 호출하고 Debug Draw 수명을 제한합니다. |
8. 이해 점검 질문 3개
9. 핵심 요약
다음 강의 연결
다음 강의: 벡터 연산에서는 변위를 정규화하고 스칼라를 곱해 원하는 속도의 이동 벡터를 만드는 과정을 다룹니다.
벡터 기초 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.