오늘의 작업 내용

상호작용 리팩토링 완료

가마솥 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

+ Recent posts