벡터 연산
4강. 벡터 연산
1. 이번 강의에서 해결할 문제
멀리 있는 목표일수록 적이 더 빠르게 움직이거나 목표 위치에 가까워지면 지나쳐 흔들립니다. 거리와 무관한 방향을 만들고 속도·시간을 별도로 적용합니다.
2. 학습 목표
3. 핵심 개념
정규화는 벡터 방향을 유지하면서 길이를 1로 만듭니다.
Direction = (Target - Current) / |Target - Current|
여기서 Target은 플레이어 위치, Current는 적 위치, | |는 벡터 길이입니다. 두 위치가 같으면 길이가 0이라 나눌 수 없으므로 GetSafeNormal을 사용합니다.
속도는 cm/s, DeltaSeconds는 s이므로 Speed × DeltaSeconds는 이번 프레임에 이동할 cm가 됩니다. 단위가 서로 맞는지 확인하면 잘못된 곱을 빨리 찾을 수 있습니다.
4. 단계별 실습
C++ · 파일 경로: Source/TopDownSurvival/AI/GameMathLibrary.h
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "GameMathLibrary.generated.h"
UCLASS()
class TOPDOWNSURVIVAL_API UGameMathLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintPure, Category = "Game Math")
static FVector Direction2D(FVector From, FVector To);
UFUNCTION(BlueprintPure, Category = "Game Math")
static FVector StepToward(
FVector Current, FVector Target, float Speed, float DeltaSeconds);
};
C++ · 파일 경로: Source/TopDownSurvival/AI/GameMathLibrary.cpp
#include "AI/GameMathLibrary.h"
FVector UGameMathLibrary::Direction2D(FVector From, FVector To)
{
FVector Delta = To - From;
Delta.Z = 0.0f;
return Delta.GetSafeNormal();
}
FVector UGameMathLibrary::StepToward(
FVector Current, FVector Target, float Speed, float DeltaSeconds)
{
const FVector Direction = Direction2D(Current, Target);
const float StepLength = FMath::Max(0.0f, Speed) * FMath::Max(0.0f, DeltaSeconds);
return Current + Direction * StepLength;
}
이 함수는 수학 확인용입니다. 실제 적 이동은 벽과 NavMesh를 고려하도록 14강에서 AI MoveTo에 맡깁니다.
Blueprint 작업
Direction2D 노드를 호출해 Debug Arrow를 그리고 From과 To가 같을 때 결과가 Zero Vector인지 확인합니다.
5. 코드와 수학·AI가 동작하는 이유
정규화가 거리 정보를 제거하므로 100cm와 1000cm 떨어진 목표가 같은 이동 속도를 만듭니다. 속도와 시간은 별도 스칼라로 방향에 곱합니다. Z를 0으로 만드는 것은 탑다운 평면 이동이라는 명시적 규칙입니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
벡터 연산 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.