오늘의 작업 내용
상호작용 리팩토링 완료
가마솥 UI 만들기
상호작용 테스트를 하다 보니 Target이 Null인 오류가 발생.

아직 원인을 못 찾음. 확인필요
[오류]다른 상호작용 대상들은 괜찮은데 채집 대상물만 외곽선 하이라이트 적용이 안 되는 오류 발생.

기존에 작성해둔 로그를 주석해제하고 확인해보았다.
LogTemp: Warning: [InteractionComponent] SetActorHighlight 호출됨
LogTemp: Warning: [InteractionComponent] Found Mesh: InteractionWidget, HighlightMaterial: Valid
새로 추가한 InteractionWidget이 UMeshComponent를 상속하고 있어서, 하이라이트 대상이 상호작용 위젯으로 잡히는 것이었다.
if (UMeshComponent* Mesh = Target->FindComponentByClass<UMeshComponent>()) // 여기서 잡힘
{
const TCHAR* Message = HighlightMaterial ? TEXT("Valid") : TEXT("NULL");
Mesh->SetOverlayMaterial(bHighlighted ? HighlightMaterial : nullptr);
UE_LOG(LogTemp, Warning, TEXT("[InteractionComponent] Found Mesh: %s, HighlightMaterial: %s"),
*Mesh->GetName(), Message);
}
검색 결과를 좀 더 좁혀서, UWidgetComponent인 경우에 하이라이트 대상에서 제외하기로 했다.
그리고 원래 메쉬 하나만 찾아서 하이라이트 했던 것을, 해당하는 메쉬 전체를 찾아서 하이라이트 하는 방식으로 변경했다.

// 하이라이트할 메쉬 찾기
TArray<UMeshComponent*> MeshComponents;
Target->GetComponents<UMeshComponent>(MeshComponents);
bool bMeshFound = false;
for (UMeshComponent* Comp : MeshComponents)
{
if (!Comp && !Comp->IsA<UWidgetComponent>())
{
continue;
}
Comp->SetOverlayMaterial(bHighlighted ? HighlightMaterial : nullptr);
bMeshFound = true;
}
// 하이라이트할 메쉬 찾기
TArray<UMeshComponent*> MeshComponents;
Target->GetComponents<UMeshComponent>(MeshComponents);
bool bMeshFound = false;
for (UMeshComponent* Comp : MeshComponents)
{
if (!Comp && !Comp->IsA<UWidgetComponent>())
{
continue;
}
Comp->SetOverlayMaterial(bHighlighted ? HighlightMaterial : nullptr);
bMeshFound = true;
}
[오류] 이미 조사를 완료한 재료임에도 다른 객체를 확인하면 텍스트가 조사하기로 뜨는 오류.

각각의 액터는 조사가 완료된 걸 알 방법이 없기 때문에 계속 조사하기라는 텍스트가 뜨게 된다.
CodexSubsystem에서 조사가 완료되었다는 걸 델리게이트로 전달해주는 방식으로 구현하면 될듯.
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnForageableItemDiscovered, UCPForageableItemData*, ItemData);
해당 델리게이트를 ResourceNodeActor에서 HandleResourceDiscovered 함수에 연결해준다.
void ACPResourceNodeActor::HandleResourceDiscovered(UCPForageableItemData* DiscoveredItem)
{
// 조사 완료된 재료 프롬프트 변경
if (!ResourceDefinition || !InteractableComponent) return;
if (ResourceDefinition->HarvestData.HarvestedItem != DiscoveredItem) return;
InteractableComponent->SetInteractionPrompt(FText::FromString(TEXT("채집하기")));
}

이제 조사가 완료된 채집물은 전부 일괄적으로 프롬프트를 변환한다.
'Unreal5 공부 > TIL' 카테고리의 다른 글
| 2026/9/17 TIL (1) | 2026.09.17 |
|---|---|
| 2026/09/15 TIL (0) | 2026.09.17 |
| 2026/09/08 TIL (0) | 2026.09.08 |
| 2026/09/03 TIL (0) | 2026.09.04 |
| 2026/09/02 TIL (0) | 2026.09.02 |
