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();
}