기존에는 ABaseItem의 콜리전 컴포넌트가 플레이어와 오버랩되면 자동으로 CurrentInteractable에 등록되는 방식을 썼다.

그러다보니 책상처럼 콜리전 범위 안에 여러 상호작용 가능한 대상(서랍, 그 안의 아이템)이 겹치는 경우 어떤 게 등록되어야 하는지 충돌이 발생했다

해결 방향 : 시선 기반 라인 트레이스

오버랩 대신 카메라가 바라보는 방향으로 매 프레임 라인 트레이스를 쏴서, 정확히 화면 중앙이 가리키는 대상만 상호작용 가능하게 만드는 방식으로 전환했다.

구현

ATheRoomCharacter에 Tick()을 오버라이드해서 매 프레임 라인 트레이스 수행:

void ATheRoomCharacter::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    FVector Start = FirstPersonCameraComponent->GetComponentLocation();
    FVector End = Start + (FirstPersonCameraComponent->GetForwardVector() * 700.0f);

    FHitResult HitResult;
    FCollisionQueryParams QueryParams;
    QueryParams.AddIgnoredActor(this);

    bool bHit = GetWorld()->LineTraceSingleByChannel(HitResult, Start, End, ECC_Visibility, QueryParams);

    ABaseItem* HitItem = bHit ? Cast<ABaseItem>(HitResult.GetActor()) : nullptr;

    if (HitItem != CurrentInteractable)
    {
        if (CurrentInteractable)
        {
            HideInteraction();
        }

        CurrentInteractable = HitItem;

        if (CurrentInteractable)
        {
            ShowInteraction();
        }
    }
}
  • AddIgnoredActor(this)로 캐릭터 자기 자신은 트레이스에서 제외
  • 이전 트레이스 대상과 달라졌을 때만 UI를 갱신해 불필요한 토글 방지

ABaseItem의 오버랩 함수는 더 이상 CurrentInteractable을 건드리지 않도록 내용을 비움

(델리게이트 연결 자체는 유지 추후 다른 용도로 재사용 가능하도록)

void ABaseItem::OnItemOverlap(...)
{
    // 라인 트레이스가 CurrentInteractable을 관리하므로 더 이상 처리하지 않음
}

트러블슈팅 : 블루프린트 에셋 손상

전환 과정에서 BP_Door만 콜리전 컴포넌트의 Details 패널이 비정상적으로 비어 보이는 문제 발생. 새 블루프린트(BP_Door_New)를 만들어 동일한 부모 클래스로 테스트한 결과 정상 작동 → 코드 문제가 아니라 블루프린트 에셋 자체의 손상으로 판단, 새 블루프린트로 교체하여 해결

 

참고 문서

Using a Single Line Trace (Raycast) by Channel in Unreal Engine | Unreal Engine 5.5 Documentation | Epic Developer Community

 

Using a Single Line Trace (Raycast) by Channel in Unreal Engine | Unreal Engine 5.5 Documentation | Epic Developer Community

This how-to guide covers using a Single Line Trace by Channel Blueprint node to return the first Actor it hits that responds on the Visibility channel, ...

dev.epicgames.com

+ Recent posts