오늘의 작업 내용
상호작용 구조 리팩토링
상호작용 구조 리팩토링
기존에 인터페이스를 가져와서 각각의 함수를 직접 액터에서 블루프린트로 구현했던 구조에서, InteractableComponent를 사용해서 편하게 사용할 수 있도록 구조 개편
추가로 원래 화면 중앙에 고정된 채로 띄웠던 상호작용 관련 UI를 각 액터에서 WidgetComponent를 띄워서 사용하는 방식으로 쓸 수 있도록 개편하려고 한다. 이로써 각 액터에서 서로 다른 상호작용 UI를 쓰기 더 편리해질 것이다.
기존의 인터페이스 구조에서 컴포넌트 구조로 수정한 이유
1. 기존의 인터페이스 구조에서는 상호작용 프롬프트나 액터명을 작성할 때 직접 액터 내에서 인터페이스 함수를 override해서 집어넣었기 때문에 불필요한 작업이 발생.
2. 인터페이스에서는 공통으로 사용할 수 있는 함수를 작성할 수 없기 때문에 각 액터에서 일일이 작성하거나, 상호작용을 하는 액터(캐릭터 등) 쪽에서 사용하는 컴포넌트에서 작성해서 코드가 지나치게 복잡해지는 문제 발생. 책임 분리를 위해서라도 상호작용 대상 액터 컴포넌트 필요.
3. 만약에 액터별로 다른 UI를 사용하고 싶다고 하면 편하게 위젯컴포넌트의 위젯만 변경하면 손쉽게 가능.
목적: InteractableComponent와 위젯 컴포넌트를 집어넣은 뒤, 변수 내용만 조금 수정하면 편하게 쓸 수 있는 구조로 개편.
기존의 InteractionComponent에서 인터페이스를 찾아서 실행하던 코드들을 전부 컴포넌트로 옮김.
if (UCPInteractableActorComponent* InteractableComp = FoundActor->FindComponentByClass<UCPInteractableActorComponent>())
{
if (InteractableComp->CanInteract())
{
InteractableComp->BeginFocus(GetOwner());
}
}
else
{
UE_LOG(LogTemp, Error, TEXT("[InteractionComponent] 대상 액터에 InteractableComponent가 없습니다."));
}
문제 발생
위젯 컴포넌트를 띄울 로직은 다 작성했는데 막상 플레이해보니 하이라이트는 되지만 위젯 컴포넌트는 뜨지 않음.
-> 컴포넌트를 찾아서 실행하는 로직 자체는 잘 되나 위젯 컴포넌트에서 문제가 생기는 것 같다.

InteractionWidget에서 위젯이 만들어질 때 HideWidget 함수를 호출하는 걸 지웠더니 이제 ICPInteractable / ICPHighlightable이 있는 테스트 액터에는 UI가 뜨는데 단순 컴포넌트가 들어있는 액터에서는 뜨지 않는다.

기존에 UI를 띄울때 사용했던 델리게이트에 위젯의 Visibility를 다루는 부분이 있었는데, 이것 때문일까?
void UCPInteractionPromptWidget::OnPromptChanged(FText Prompt, FName TargetName)
{
bool bHasTarget = !Prompt.IsEmpty();
if (bHasTarget && TextBlock_InteractionPrompt)
{
TextBlock_ActorName->SetText(FText::FromName(TargetName));
TextBlock_InteractionPrompt->SetText(Prompt);
}
bHasTarget ? ShowWidget() : HideWidget();
}



Space 설정을 Screen으로 해주니까 잘뜬다...
기존에 UI에서 직접 만들어서 넣어놨던 F도 키보드 프롬프트용 아이콘으로 변경시켜줬다.

'Unreal5 공부 > TIL' 카테고리의 다른 글
| 2026/09/08 TIL (0) | 2026.09.08 |
|---|---|
| 2026/09/03 TIL (0) | 2026.09.04 |
| 2026/08/28 TIL (0) | 2026.08.31 |
| 2026/08/27 TIL (0) | 2026.08.28 |
| 2026/08/26 (0) | 2026.08.26 |
