기존에는 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
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
'프로젝트 > The Room (방탈출 게임)' 카테고리의 다른 글
| BrightLetter 추가, 메시 작업 (0) | 2026.06.25 |
|---|---|
| Custom Depth와 Post Process Material로 인터랙션 대상 외곽선 그리기 (0) | 2026.06.23 |
| 상호작용하면 열리는 서랍장 만들기 (0) | 2026.06.22 |
| 편지를 읽어야 문이 열리는 시스템 만들기 (0) | 2026.06.22 |
| 편지 토글과 안내 UI 겹침 문제 해결 (0) | 2026.06.22 |
