오늘의 작업

타이틀 연출 작업

- 디자인 폴리싱

 

 

폴리싱

호버/언호버 애니메이션 추가

마우스를 올려놓으면 줄이 그어지는 애니메이션을 추가했다.

그런데 모든 버튼에 하나하나 설정하는게 번거로워서 하나의 위젯으로 통일해서 공통적으로 사용하게 할 수 있도록 하려고 한다.

 

공통 위젯으로 만들었더니 호버가 제대로 작동하지 않는 오류가 있어 디버그 로그를 만들어 출력시켜보았다.

 

로그는 제대로 뜨는 걸 보니 호버 인식 자체는 되는데, 애니메이션 재생이 제대로 되지 않는 것 같다.

 

 

'Unreal5 공부 > TIL' 카테고리의 다른 글

2026/09/22 TIL  (0) 2026.09.22
2026/09/21 TIL  (0) 2026.09.22
2026/9/17 TIL  (1) 2026.09.17
2026/09/15 TIL  (0) 2026.09.17
2026/09/09 TIL  (1) 2026.09.09

 

 

오늘의 작업

타이틀 연출

 

 


 

타이틀 연출

계속 마우스 호버 인식 자체가 안 되던 문제를 해결했다...

원인은 support UV From Hit Results가 되지 않아서 마우스 트레이싱에 반응하지 않았던 것...

 

남은 문제는 이제 호버는 잘 인식이 되는데 마우스 클릭이 안 된다는 점이다.

 

사실 알고보니 Widget 내에 있던 Image가 버튼을 덮어쓰고 있었다. 해결완료

 

 

언리얼 엔진의 사운드 에셋은 사운드가 0이 되면 자동으로 가상화되도록 설정되어 있다.

사운드가 0이 되어도 처음부터 시작하지 않게 하려면 사운드 에셋의 Virtualization Mode 프로퍼티를 바꿔야 한다.

'Unreal5 공부 > TIL' 카테고리의 다른 글

2026/09/23 TIL  (0) 2026.09.24
2026/09/21 TIL  (0) 2026.09.22
2026/9/17 TIL  (1) 2026.09.17
2026/09/15 TIL  (0) 2026.09.17
2026/09/09 TIL  (1) 2026.09.09

 

오늘의 작업

 

타이틀 화면 연출

 

이 책 에셋을 사용해서 책이 펼쳐지는 연출을 하려고 한다.

 

다만 책 제목을 게임 이름으로 바꿀 필요가 있다.

책 에셋의 텍스쳐 파일이 있어서 이걸 토대로 만들어 볼 생각.

 

 

'Unreal5 공부 > TIL' 카테고리의 다른 글

2026/09/23 TIL  (0) 2026.09.24
2026/09/22 TIL  (0) 2026.09.22
2026/9/17 TIL  (1) 2026.09.17
2026/09/15 TIL  (0) 2026.09.17
2026/09/09 TIL  (1) 2026.09.09

 

오늘의 목표

옵션 UI 만들기

 

옵션에 해상도를 설정하는 UI를 만들고 기능을 구현한 뒤 확인해보다가 다음과 같이 중단됨.

 

이건 언리얼 엔진 내의 오류인 것 같다. 해상도를 테스트 할때는 가급적 StandAlone Game 모드를 사용해야 이런 오류를 피할 수 있다고 한다.

 

[오류] StandAloneGame 모드로 플레이해서 WindowMode를 바꿨는데 아무 일도 안 일어나고 그냥 FullScreen처럼 보인다.

에디터 환경에서 StandAlone Game의 해상도를 강제 override 하고 있는 것 같아서 패키징 환경에서 나중에 확인해보기로 했다.

 

일단은 오디오 설정 연결부터.

 

아래쪽 블러가 제대로 안 됨.

 

 

최종 설정화면~

 

테스트 중 발견한 버그

StandAlone Game으로 실행했을때 해상도 문제인지 NPC 대사 Text가 UI를 빠져나간다.

'Unreal5 공부 > TIL' 카테고리의 다른 글

2026/09/22 TIL  (0) 2026.09.22
2026/09/21 TIL  (0) 2026.09.22
2026/09/15 TIL  (0) 2026.09.17
2026/09/09 TIL  (1) 2026.09.09
2026/09/08 TIL  (0) 2026.09.08

 

오늘의 작업 내용

  • 플레이어 체력 UI 데이터 연결
  • 상점 UI 디자인 폴리싱

 

플레이어에 붙어있는 HealthComponent에서 MaxHealth를 가져와서 UI에 연결.

기존에 피격 애니메이션 등의 용도로 사용하던 OnDamaged 델리게이트를 통해 대미지 계수를 받아와서 하트 개수에 맞춰 치환한 뒤 피격이 적용되도록 설정함. (예시: MaxHealth 

 

상점 UI 디자인 폴리싱

 

 

'Unreal5 공부 > TIL' 카테고리의 다른 글

2026/09/21 TIL  (0) 2026.09.22
2026/9/17 TIL  (1) 2026.09.17
2026/09/09 TIL  (1) 2026.09.09
2026/09/08 TIL  (0) 2026.09.08
2026/09/03 TIL  (0) 2026.09.04

오늘의 작업 내용

상호작용 리팩토링 완료

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

오늘의 작업내용

채집 상호작용 (시간형 상호작용) 리팩토링 완료

가마솥 UI 만들기

 

채집 상호작용 (시간형 상호작용) 리팩토링

 

[오류] Spawner를 통해 생성된 채집물의 모든 상호작용 위젯이 한 곳에 고정되는 오류 발생.

 

생성된 위젯을 Mesh에 고정시켜주지 않아서 발생함. 

InteractWidgetComponent = CreateDefaultSubobject<UWidgetComponent>(TEXT("WidgetComponent"));
InteractWidgetComponent->SetupAttachment(Mesh);

 

수정 완료

 

 

[오류] 채집 시 아무 일도 일어나지 않는 오류. 상호작용 프로그레스 바만 뜨고 아무것도 바뀌지 않음.

 

로그

LogTemp: Warning: [ResourceActor] 채집 상호작용 호출됨
LogTemp: Warning: HandleInteract 함수 호출됨
LogTemp: Warning: 채집중...

 

채집 함수까지는 호출이 되는데 내부에서 작동이 되지 않는 부분이 있는 것 같다.

 

LogTemp: Warning: POOL SPAWN : BP_TestResourceNodeActor_C_6
LogTemp: Warning: [InitializeResource] Prompt=채집하기, ItemName=꿈이삭풀
LogTemp: Warning: [InitializeResource] Prompt=채집하기, ItemName=꿈이삭풀
LogTemp: Warning: POOL SPAWN : BP_TestResourceNodeActor_C_7
LogTemp: Warning: [InitializeResource] Prompt=채집하기, ItemName=새벽이슬꽃
LogTemp: Warning: [InitializeResource] Prompt=채집하기, ItemName=새벽이슬꽃
LogTemp: Warning: POOL SPAWN : BP_TestResourceNodeActor_C_8
LogTemp: Warning: [InitializeResource] Prompt=채집하기, ItemName=새벽이슬꽃
LogTemp: Warning: [InitializeResource] Prompt=채집하기, ItemName=새벽이슬꽃
LogTemp: Warning: POOL SPAWN : BP_TestResourceNodeActor_C_9
LogTemp: Warning: [InitializeResource] Prompt=채집하기, ItemName=새벽이슬꽃
LogTemp: Warning: [InitializeResource] Prompt=채집하기, ItemName=새벽이슬꽃
LogTemp: Warning: POOL SPAWN : BP_TestResourceNodeActor_C_10
LogTemp: Warning: [InitializeResource] Prompt=채집하기, ItemName=꿈이삭풀
LogTemp: Warning: [InitializeResource] Prompt=채집하기, ItemName=꿈이삭풀

 

그리고 조사를 아직 안 한 상태에서는 프롬프트가 조사하기가 되어야하는데 적용이 안 됨. 이부분부터 확인해보려고 한다.

이부분은 프롬프트 삼항연산자가 반대로 되어있어서 생긴 문제였다.

	FText PromptText = bIsDiscovered ? FText::FromString(TEXT("채집하기")) : FText::FromString(TEXT("조사하기"));;

 

그리고 Pool에서 가져와서 사용하는 액터이기 때문에 Pool에서 가져올 때 뿐만 아니라 중간에 UI Refresh를 해줄 필요성이 있다. 일단 이건 이후에 처리하는 걸로 하고 일단은 채집 제대로 작동하지 않는 문제부터 해결해보자.

 

 

중단점 찍어서 확인해본 결과 193번째 줄의 TryHarvest가 false로 나오는 것 같다. 

 

TryHarvest 내부의 DroppedItemClass가 nullptr로 반환되는 문제 확인.

 

DroppedItemClass에 BP_CPDroppedItem 설정해주니 정상적으로 채집됨.

 

'Unreal5 공부 > TIL' 카테고리의 다른 글

2026/09/15 TIL  (0) 2026.09.17
2026/09/09 TIL  (1) 2026.09.09
2026/09/03 TIL  (0) 2026.09.04
2026/09/02 TIL  (0) 2026.09.02
2026/08/28 TIL  (0) 2026.08.31

 

오늘의 목표

  • 상호작용 UI 최신화하기
  • NPC 오버헤드 퀘스트 UI

 

 

상호작용 UI 최신화

 

내가 컴포넌트를 사용하도록 수정한 코드와 팀원이 개편한 InteractionComponent 코드 사이에 충돌 발생.

최신화를 제때 하지 않아서 생긴 문제이다. 앞으로 제때 최신 코드를 받아서 사용할것을 명심하자...

 

로직 충돌로 끊긴 부분 연결중.

 

이상한 오류가 발생했다

기존의 Interactable 인터페이스와 컴포넌트방식을 둘 다 살린 상태로 가려고 했는데, 아무래도 컴포넌트 방식으로 전부 이식하는게 맞을 것 같아 컴포넌트 방식으로 전환하기로 했다.

 

컴포넌트 방식으로 일단 전환 성공했는데 위젯이 보이지 않아서 왜그런지 원인을 살펴봤더니 위젯 자체에서 생성될 때 호출하던 HideWidget 함수가 원인이었다. 

void UCPInteractionPromptWidget::NativeConstruct()
{
    Super::NativeConstruct();
    
    // WBP의 원래 색상 저장
    CacheDefaultColors();
    
    // HideWidget();
}

 

주석처리 하니 이제 잘 보인다.

 

이제 Focus 안 하고 있을 때 위젯이 꺼지는 게 안 된다.

 

 

로그를 확인해보니 내가 기존에 설정해놓은 위젯 꺼짐 로그가 아예 뜨지 않는게 보임.

void UCPInteractableComponent::EndFocus(AActor* Interactor)
{
    if (InteractWidgetComp)
    {
       InteractWidgetComp->SetVisibility(false);
    }
    UE_LOG(LogTemp, Warning, TEXT("[InteractableComponent]위젯 꺼짐!"))
}

 

EndFocus가 호출되지 않고 있는 것 같다.

 

// 수정 전
if (!IsValid(NewTarget))
{
    OnPromptChanged.Broadcast(FText::GetEmpty(), NAME_None, ECPInteractionDisplayState::Hidden);
    return;
}

if (UCPInteractableComponent* NewComp = NewTarget->FindComponentByClass<UCPInteractableComponent>())
{
    if (CurrentDisplayState == ECPInteractionDisplayState::Enabled)
    {
       SetActorHighlight(NewTarget, true);
       NewComp->BeginFocus(GetOwner());
    }
}

// 수정 후
	if (AActor* PreviousTarget = CurrentTarget.Get())
	{
		SetActorHighlight(PreviousTarget, false);
		if (UCPInteractableComponent* PrevComp = PreviousTarget->FindComponentByClass<UCPInteractableComponent>())
		{
			PrevComp->EndFocus(GetOwner());
		}
	}

	CurrentTarget = NewTarget;
	CurrentDisplayState = NewDisplayState;
	
	if (!IsValid(NewTarget))
	{
		return;
	}
	
	UCPInteractableComponent* NewComp = NewTarget->FindComponentByClass<UCPInteractableComponent>();
	if (!IsValid(NewComp)) return;
	
	if (CurrentDisplayState == ECPInteractionDisplayState::Enabled)
	{
		SetActorHighlight(NewTarget, true);
		NewComp->BeginFocus(GetOwner());
	}

 

 

이제 켜기/끄기 정상적으로 작동함.

 

 

기존의 채집 액터에도 인터페이스를 사용한 코드가 남아있었다.

 

인터페이스를 싹 없애고 컴포넌트용으로 개조중.

'Unreal5 공부 > TIL' 카테고리의 다른 글

2026/09/09 TIL  (1) 2026.09.09
2026/09/08 TIL  (0) 2026.09.08
2026/09/02 TIL  (0) 2026.09.02
2026/08/28 TIL  (0) 2026.08.31
2026/08/27 TIL  (0) 2026.08.28

 

오늘의 작업 내용

 

상호작용 구조 리팩토링

 


상호작용 구조 리팩토링

 

기존에 인터페이스를 가져와서 각각의 함수를 직접 액터에서 블루프린트로 구현했던 구조에서, 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

 

오늘의 작업 내용

  • 위젯 열기 시스템 리팩토링

 

 

위젯 열기 시스템 리팩토링

PopupWidget 시스템에 위젯을 캐싱해두고 Visibility 토글할 수 있는 기능 추가.

 

[?] 이러면 기존의 BaseFixedWidget/BasePopupWidget이 무의미해지지 않나? 라는 의문이 생김.

FixedWidget에도 Visibility 변경 기능이 있기 때문이다.

 

[답] 입력 변경때문에 구분이 필요하다.

FixedWidget : 입력 변경 X, 배경에 항상 존재하는 위젯 (미니맵 등)

PopupWidget : 입력 변경 O (인벤토리 등)

 

ESC 눌렀을 때 팝업 위젯만 차례로 닫는 등의 조작을 위해서라도 구분은 필요함. 

 

 

로딩화면

 

현재 OpenLevel 형식으로 레벨 이동을 하도록 설정되어있음. 이거에 맞춰서 로딩화면 구상하기.

 

이러면 GameInstance나 레벨이동 직전 블루프린트 쪽에서 영화 플레이어 API를 사용해서 위젯을 띄우거나, LoadingLevel을 비동기식으로 열어서 메인레벨이 열리는 순간 바로 메인레벨로 이동하는 구조로 하는 방법을 쓸 수 있음.

 

좀 더 간단한 구조를 가진 후자를 사용하기로 결정.

 

플러그인을 사용하면 좀 더 쉽게 로딩화면을 구현할 수 있는 것 같음.

 

https://www.youtube.com/watch?v=TRpFxT9zGu8

'Unreal5 공부 > TIL' 카테고리의 다른 글

2026/09/03 TIL  (0) 2026.09.04
2026/09/02 TIL  (0) 2026.09.02
2026/08/27 TIL  (0) 2026.08.28
2026/08/26  (0) 2026.08.26
2026/08/25 TIL  (0) 2026.08.25

+ Recent posts