게임 수학 · 게임 AI 기초집LESSON 10
Line Trace와 시야 판정
난이도초급
예상 시간45분
선수지식6강의 내적, 9강의 보간
10강. Line Trace와 시야 판정
1. 이번 강의에서 해결할 문제
플레이어가 시야각 안에 있지만 벽 뒤에 있어도 적이 추적합니다. 저렴한 거리·각도 검사 뒤 필요한 후보에만 물리 Trace를 실행합니다.
2. 학습 목표
3. 핵심 개념
Line Trace는 시작과 끝 사이에서 충돌 응답을 질의합니다. 수학적 시야 원뿔은 장애물을 모르므로 Trace와 결합해야 합니다.
- 추적 거리 밖이면 즉시 false
- 내적 시야각 밖이면 false
- 남은 목표에만 Line Trace
이 순서는 비싼 물리 질의 횟수를 줄입니다. Trace 채널은 프로젝트 충돌 정책이며 Mesh가 Visibility를 Ignore하면 벽을 통과해 보일 수 있습니다.
4. 단계별 실습
C++ · 파일 경로: Source/TopDownSurvival/AI/MathAIController.h · 감지 API
MathAIController.h · 추가
private:
bool HasClearSight(AActor* Target) const;
UPROPERTY(EditDefaultsOnly, Category = "AI|Senses",
meta = (ClampMin = "0.0", Units = "cm"))
float SightDistance = 1400.0f;
UPROPERTY(EditDefaultsOnly, Category = "AI|Senses",
meta = (ClampMin = "0.0", ClampMax = "360.0", Units = "deg"))
float ViewAngle = 100.0f;
C++ · 파일 경로: Source/TopDownSurvival/AI/MathAIController.cpp
MathAIController.cpp · 시야 검사
#include "AI/GameMathLibrary.h"
#include "DrawDebugHelpers.h"
#include "Engine/World.h"
bool AMathAIController::HasClearSight(AActor* Target) const
{
const APawn* Observer = GetPawn();
if (!IsValid(Observer) || !IsValid(Target))
{
return false;
}
const FVector Start = Observer->GetActorLocation() + FVector(0.0, 0.0, 60.0);
const FVector End = Target->GetActorLocation() + FVector(0.0, 0.0, 50.0);
if (!UGameMathLibrary::IsWithinRange2D(Start, End, SightDistance) ||
!UGameMathLibrary::IsInsideViewCone2D(
Observer->GetActorForwardVector(), Start, End, ViewAngle))
{
return false;
}
FCollisionQueryParams Params(SCENE_QUERY_STAT(AISight), false, Observer);
FHitResult Hit;
const bool bBlocked = GetWorld()->LineTraceSingleByChannel(
Hit, Start, End, ECC_Visibility, Params);
const bool bVisible = !bBlocked || Hit.GetActor() == Target;
#if ENABLE_DRAW_DEBUG
DrawDebugLine(
GetWorld(), Start, End,
bVisible ? FColor::Green : FColor::Red, false, 0.3f, 0, 1.5f);
#endif
return bVisible;
}
Unreal Editor 작업
플레이어와 적 사이에 Cube 벽을 배치하고 Cube Collision의 Visibility Response를 Block으로 설정합니다. 벽을 치웠을 때만 Green Line과 추적 상태가 되는지 확인합니다.
5. 코드와 수학·AI가 동작하는 이유
거리와 내적은 숫자 연산으로 후보를 빠르게 제거하고 Line Trace는 실제 충돌 공간을 확인합니다. Observer를 Ignore해 자신 Capsule에 즉시 맞는 것을 막습니다. 첫 Block이 Target이면 시야가 확보된 것이고 다른 Actor면 가려진 상태입니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
MINI QUIZ
0 / 2Line Trace와 시야 판정 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
10강. Line Trace와 시야 판정 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.