본문 바로가기
[ Unreal5 ]/- 언리얼엔진5 실습

언리얼엔진5 c++ Widget Image Change, Widget Text Change

by MRG 2024. 9. 27.
728x90
반응형

 


  헤더 파일 추가 (#include "Components/Image.h")
UImage를 사용하기 위해 Components/Image.h 헤더를 추가합니다. 이 헤더에는 이미지 위젯과 관련된 모든 함수 및 클래스가 정의되어 있습니다.

▣  조건 체크 및 초기화
if (Animinstance->IsGetWeapon && Animinstance->WeaponType != 3):
플레이어가 무기를 장착하고 있고, 무기의 종류가 특정 타입(3번 타입)이 아닌 경우 조준 상태로 변경하는 조건입니다.
if (HUDClass == nullptr):
HUDClass가 아직 로드되지 않은 상태라면, LoadClass를 사용해 블루프린트 위젯 클래스를 로드합니다.
TEXT("/Game/UMG/WB_HUD.WB_HUD_C") 경로를 사용해 블루프린트 클래스를 로드합니다.


▣  HUD 위젯 생성 및 뷰포트에 추가
CreateWidget<UUserWidget>(...):
CreateWidget를 사용하여 UUserWidget 인스턴스를 생성합니다.
AddToViewport()는 HUD 위젯을 화면에 표시하도록 추가하는 함수입니다.


▣  텍스처 로드
UTexture2D* NewAimImage = LoadObject<UTexture2D>(nullptr, TEXT("/Game/Textures/NewWeaponAimImage.NewWeaponAimImage"));
새로운 조준 텍스처를 로드합니다. 경로는 게임의 콘텐츠 브라우저에 있는 텍스처 파일의 경로를 사용합니다.


▣  이미지 위젯 찾기
UImage* WeaponAimImage = Cast<UImage>(HUDWidget->GetWidgetFromName(TEXT("WeaponAimImage")));
GetWidgetFromName를 사용하여 블루프린트에서 추가된 Image 위젯을 찾습니다.
"WeaponAimImage"는 블루프린트에서 해당 이미지 위젯의 이름입니다. 이를 통해 특정 UImage 위젯에 접근할 수 있습니다.


▣  기존 이미지 크기 가져오기
FVector2D CurrentImageSize = WeaponAimImage->Brush.ImageSize;
Brush.ImageSize를 사용하여 기존 UImage 위젯의 크기를 가져옵니다. ImageSize는 FVector2D 타입으로 가로와 세로 크기를 나타냅니다.


▣  이미지 변경
WeaponAimImage->SetBrushFromTexture(NewAimImage);
새로운 텍스처를 사용해 UImage 위젯의 브러시를 변경합니다. 이 함수는 이미지를 동적으로 변경할 때 사용됩니다.


▣ 기존 크기 유지
WeaponAimImage->SetBrushSize(CurrentImageSize);
기존 UImage의 크기를 SetBrushSize 함수를 통해 유지하면서 새로운 텍스처가 적용되도록 합니다.
이를 통해 이미지를 변경해도 기존 이미지와 동일한 크기가 유지됩니다.

 

 

 



 

  코드 설명:
이 코드는 플레이어가 무기를 들고 있을 때 조준 모드(Aim Mode)로 진입하고, HUD 위젯을 생성하여 무기 관련 UI를 업데이트한 후, 타임라인을 시작하는 과정입니다.

무기 소유 및 조준 가능 상태 확인:
Animinstance->IsGetWeapon가 true이고, 무기 타입이 3(예: 근접 무기와 같은 비조준 무기)이 아닌 경우에만 코드가 실행됩니다. 즉, 무기가 조준 가능한 상태인지를 먼저 확인합니다.


HUD 위젯 생성 및 추가:
HUDWidget이 존재하지 않으면 CreateWidget 함수를 호출하여 새로운 HUD 위젯을 생성합니다.
위젯이 유효하고, 아직 화면(Viewport)에 추가되지 않은 경우 AddToViewport()를 호출하여 UI를 화면에 표시합니다.


위젯에서 무기 조준 이미지 설정:
HUDWidget에서 조준 이미지를 표시할 UImage 컴포넌트를 찾습니다. 위젯 내부의 이름이 WeaponAimImage인 컴포넌트를 가져옵니다.
무기 이미지가 제대로 존재하는지 확인한 후, 이미지 맵(WeaponAimImageMap)에서 Revolver에 해당하는 텍스처를 찾아 이미지로 설정합니다.
SetBrushFromTexture 함수를 통해 새로운 텍스처로 이미지를 변경하고, 기존의 이미지 크기를 유지하면서 적용합니다.

 

  코드 설명:

Widget에 있는 Text도 UTextBlock으로 받아와서 FText로 값을 지정하고 숨기기 보이기도 할 수 있습니다. 

레벨 전환 시 UMG Widget들이 새롭게 생성되거나 초기화되는데, 이 과정에서 포인터들이 재설정되지 않기 때문입니다.

 

▣ 구체적인 원인

원인설명
HUDWidget, WeaponAimImage 등 포인터들이 이전 레벨에서 생성된 인스턴스를 참조 레벨이 바뀌면 이 인스턴스들은 파괴되고 새로 생성됨
GetWidgetFromName()로 다시 바인딩하지 않음 새 레벨에서는 해당 포인터들이 null로 남아 있음
IconImageMap의 텍스처도 재로딩이 필요할 수 있음 텍스처가 레벨마다 개별로 할당되는 경우

 

 

▣ 설명
IsValid(HUDWidget)는 nullptr인지, 파괴된 객체인지, GC된 상태인지 전부 확인해주므로 가장 안정적입니다.

 

 

▣ 관련 API

 

https://docs.unrealengine.com/5.0/en-US/API/Runtime/UMG/Components/UImage/SetBrushFromTexture/

 

https://docs.unrealengine.com/5.0/en-US/API/Runtime/UMG/Components/UImage/SetBrushSize/

 

https://docs.unrealengine.com/4.27/en-US/API/Runtime/UMG/Components/UImage/SetBrushFromTexture/

 

https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Components/UTimelineComponent/PlayFromStart/

 

728x90
반응형

댓글