LineTraceSingleByChannel을 사용하여 플레이어 시선(Camera View) 기준의 객체를
정밀하게 감지합니다.
특정 클래스로 캐스팅(Cast)하는 대신 ImplementsInterface를 통해
인터페이스 구현 여부만 체크함으로써, 객체 간의 결합도(Coupling)를 낮추고
상호작용 대상의 확장성을 확보했습니다.
//Police.cpp
void APolice::PerformInteractionCheck()
{
//1. 대화 중이거나 상호작용 중일 때는 감지 중단 (예외 처리)
if (InteractionData.CurrentInteractable)
{
//...(생략_캐스팅 및 상태 확인 로직)...
return;
}
InteractionData.LastInteractionCheckTime = GetWorld()->GetTimeSeconds();
//2. 레이캐스트 시작/끝 지점 계산
FVector TraceStart = GetPawnViewLocation();
FVector TraceEnd = TraceStart + (GetViewRotation().Vector() * InteractionCheckDistance);
FCollisionQueryParams QueryParams;
QueryParams.AddIgnoredActor(this); // 플레이어 자신은 무시
FHitResult TraceHit;
//3. LineTrace 실행 (Visibility 채널 사용)
if (GetWorld()->LineTraceSingleByChannel(TraceHit, TraceStart, TraceEnd, ECC_Visibility, QueryParams))
{
//4. 인터페이스(IInteractionInterface)를 구현했는지 확인
if (TraceHit.GetActor()->GetClass()->ImplementsInterface(UInteractionInterface::StaticClass()))
{
//새로운 상호작용 대상 발견 시 로직 수행
if (TraceHit.GetActor() != InteractionData.CurrentInteractable)
{
FoundInteractable(TraceHit.GetActor());
}
return;
}
}
//감지된 것이 없으면 초기화
NoInteractableFound();
}