InteractionComponent.cpp의 TraceForInteractable 함수
PlayerController->GetPlayerViewPoint(TraceStartLocation, TraceDirection);
이 부분이 카메라 시점에서 라인트레이스를 쏘고 있음
// InteractionComponent.h
protected:
UPROPERTY(EditDefaultsOnly, Category="Interaction")
float BaseEyeHeight = 80.0f; // 캐릭터 눈 높이
// InteractionComponent.cpp
bool UInteractionComponent::TraceForInteractable(FHitResult& HitResult)
{
ACharacter* OwnerCharacter = Cast<ACharacter>(GetOwner());
if (!OwnerCharacter) return false;
APlayerController* PlayerController = OwnerCharacter->GetController<APlayerController>();
if (!PlayerController) return false;
// 캐릭터 위치에서 눈 높이만큼 올린 곳을 시작점으로 합니다
FVector TraceStartLocation = OwnerCharacter->GetActorLocation() + FVector(0, 0, BaseEyeHeight);
// 플레이어가 조종하는 방향(카메라 방향과 동일)을 사용합니다
FRotator ControlRotation = PlayerController->GetControlRotation();
FVector TraceEndLocation = TraceStartLocation + (ControlRotation.Vector() * InteractionDistance);
TArray<AActor*> ActorsToIgnore;
ActorsToIgnore.Add(OwnerCharacter);
UKismetSystemLibrary::LineTraceSingle(
this,
TraceStartLocation,
TraceEndLocation,
UEngineTypes::ConvertToTraceType(ECC_Visibility),
false,
ActorsToIgnore,
EDrawDebugTrace::None,
HitResult,
true,
FLinearColor::Red,
FLinearColor::Green,
1.0f
);
if (HitResult.bBlockingHit && HitResult.GetActor())
{
if (HitResult.GetActor()->Implements<UInteractable>())
{
return true;
}
}
return false;
}

캐릭터 > 컴포넌트 > Base Eye Heigh 에서 눈높이 변경 가능
Base Eye Height 값 확인80.0 (보통 적당해)100.060.0
사진1

사진2
사진1처럼 뒤돌아도 액터 감지가 가능하지만 캐릭터의 눈높이에 맞는 위치에 와야만 작은 액터가 감지된다.

📎 트레이스 개요 | 언리얼 엔진 5.6 문서 | Epic Developer Community
// InteractionComponent.h
protected:
// 기존 코드...
UPROPERTY(EditDefaultsOnly, Category="Interaction")
float BaseEyeHeight = 80.0f; // 캐릭터 눈 높이
UPROPERTY(EditDefaultsOnly, Category="Interaction")
float SphereTraceRadius = 30.0f; // 구체 트레이스 반지름
// InteractionComponent.cpp
bool UInteractionComponent::TraceForInteractable(FHitResult& HitResult)
{
ACharacter* OwnerCharacter = Cast<ACharacter>(GetOwner());
if (!OwnerCharacter) return false;
APlayerController* PlayerController = OwnerCharacter->GetController<APlayerController>();
if (!PlayerController) return false;
// 캐릭터 위치에서 눈 높이만큼 올린 곳을 시작점으로 합니다
FVector TraceStartLocation = OwnerCharacter->GetActorLocation() + FVector(0, 0, BaseEyeHeight);
// 플레이어가 조종하는 방향(카메라 방향과 동일)을 사용합니다
FRotator ControlRotation = PlayerController->GetControlRotation();
FVector TraceEndLocation = TraceStartLocation + (ControlRotation.Vector() * InteractionDistance);
TArray<AActor*> ActorsToIgnore;
ActorsToIgnore.Add(OwnerCharacter);
// Sphere Trace로 변경 - 작은 물체도 잘 감지됩니다
UKismetSystemLibrary::SphereTraceSingle(
this,
TraceStartLocation,
TraceEndLocation,
SphereTraceRadius, // 반지름 (헤더에 추가 필요)
UEngineTypes::ConvertToTraceType(ECC_Visibility),
false,
ActorsToIgnore,
EDrawDebugTrace::None,
HitResult,
true,
FLinearColor::Red,
FLinearColor::Green,
1.0f
);
if (HitResult.bBlockingHit && HitResult.GetActor())
{
if (HitResult.GetActor()->Implements<UInteractable>())
{
return true;
}
}
return false;
}

캐릭터 > 컴포넌트 > Base Eye Heigh 에서 눈높이 변경 가능 > Sphere Trace Radius 에서 구체 반지름 변경 가능
80.0100.060.030.0 (반지름 30cm)50.0

방법 1만큼 안 숙여도 감지되고 뒤돌아서도 감지됨!


SphereTrace 범위와 작동하는지 확인하고 싶으면
// InteractionComponent.cpp
EDrawDebugTrace::None, // 이 부분을
EDrawDebugTrace::ForDuration, // 이렇게 바꾸기