본문으로 건너뛰기
게임 수학 · 게임 AI 기초집LESSON 10

Line Trace와 시야 판정

난이도초급
예상 시간45분
선수지식6강의 내적, 9강의 보간

10강. Line Trace와 시야 판정

1. 이번 강의에서 해결할 문제​

플레이어가 시야각 안에 있지만 벽 뒤에 있어도 적이 추적합니다. 저렴한 거리·각도 검사 뒤 필요한 후보에만 물리 Trace를 실행합니다.

2. 학습 목표​

3. 핵심 개념​

Line Trace는 시작과 끝 사이에서 충돌 응답을 질의합니다. 수학적 시야 원뿔은 장애물을 모르므로 Trace와 결합해야 합니다.

  1. 추적 거리 밖이면 즉시 false
  2. 내적 시야각 밖이면 false
  3. 남은 목표에만 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

Line Trace와 시야 판정 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“Line Trace와 시야 판정” 작업 전 검토에서 채택해야 할 안전 기준은 무엇인가요?
  2. 문제 2“Line Trace와 시야 판정” 실습 중 ‘모든 적이 Tick마다 Trace’ 상황을 발견했습니다. 본문과 일치하는 설명은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

10강. Line Trace와 시야 판정 미완료 상태