UE5) UMG 관련 팁들

코드에서 위젯 애니메이션 사용

헤더에 다음과 같은 변수를 선언

UPROPERTY(meta = (BindWidgetAnim),Transient)
class UWidgetAnimation* MyAnimation;

에디터에서 생성한 MyAnimation이라는 이름의 애니메이션이 동기화 됨.


전체 UI 스케일 변경


위젯 블루프린트와 연동하는 몇가지 방법

  1. GetWidgetFromName()
  2. UPROPERTY 선언 후 변수이름 일치시키기
  3. UPROPERTY(meta = (BindWidget)) 준 뒤 이름 맞추기

2번과 3번의 차이가 무엇이냐 하면,
2번의 경우 에디터에서 연동한 위젯의 요소들의 이름을 변경하면 다시 연동하기 위해서

  1. 부모를 UserWidget으로 돌린 후
  2. 이름을 변경하고
  3. 다시 부모를 바꿔줘야 함

개귀찮으니 3번을 권장함.

또한 3번을 사용하면 블루프린트 그래프 내부에서도 사용 가능한 변수가 된다.


스크롤박스보다는 리스트뷰를 사용할 것.

성능이슈가 있습니다.
관련 링크


ESlateVisibility.Visible과 ESlateVisibility.SelfHitTestInvisible의 차이점

ESlateVisibility::Visible인 경우,

해당 위젯 아래 위치한 다른 위젯들(위젯 컴포넌트에 표시되는 위젯 등)을 가려버리는 설정이라 상호작용이 불가능 해 집니다.

반대로 ESlateVisibility::SelfHitTestInvisible 는 해당 위젯 및 해당 위젯 아래 위치한 다른 위젯들과도 상호작용이 가능한 설정입니다


Widget의 GetDesiredSize()가 0인경우

위젯을 생성하자마자 크기나 다른 이슈로 위젯의 사이즈를 가져왔는데 가끔 0이 나오는 경우가 있다.

위젯 사이즈 내부 변수는 위젯이 생성된 후 다음프레임에 갱신된다고 한다.

생성되자마자는 값이 0인 상태인 것.

이 때, 사이즈를 갱신하라고 강제로 업데이트 해 줄 수 있다.

MyWidget->ForceLayoutPrepass();

위 함수 호출 후 사이즈가 정상적으로 나온다.


마우스 우클릭시 마우스가 순간 사라짐 or 마우스 클릭 이벤트가 정상 동작하지 않음

마우스 우클릭시 마우스 빠져나감이 트리거 되는 현상

우클릭에 대한 기본 동작 방식 때문입니다. 기본적으로 우클릭은 마우스를 클릭하고 드래그하는 것으로 간주되어서, 마우스가 UMG 위에 있을 때 우클릭을 하면 UMG 내부에서 드래그가 발생하지 않는 한, 마우스가 UMG 밖으로 이동한 것으로 인식됩니다.

이를 해결하기 위해서는, UMG 위에서 우클릭을 인식하는 방법이 필요합니다. 이를 위해서는 아래와 같이 작업할 수 있습니다.

  1. UMG에서 OnMouseButtonDown 이벤트를 구현합니다.
  2. 해당 이벤트에서 마우스 버튼이 우클릭인지 확인합니다.
  3. 우클릭이라면, 해당 이벤트에서 마우스 포인터가 UMG 위에 있음을 알리는 플래그를 설정합니다.
  4. UMG에서 OnMouseButtonUp 이벤트를 구현합니다.
  5. 해당 이벤트에서 마우스 버튼이 우클릭인지 확인합니다.
  6. 우클릭이라면, 해당 이벤트에서 마우스 포인터가 UMG 위에 있음을 알리는 플래그를 해제합니다.

이렇게 하면, 마우스가 UMG 위에서 우클릭을 하더라도 마우스 포인터가 UMG 밖으로 나간 것으로 인식하지 않고, 계속 UMG 위에 있게 됩니다.


Widget Tree

위젯의 트리구조를 나타내는 클래스

내가 생성한 UMG의 구조가 다음과 같다고 하자.

  • RootCanvas
  • Border
    • Button
    • Button1
    • Button2

기존에는 해더에 내가 접근하고 싶은 오브젝트를 변수로 선언한 뒤 접근했지만,
접근해야 하는 대상이 너무 많을 경우 일일히 선언해서 접근하기 힘든 문제가 있다.

이 때 사용하면 좋다고 생각되는 것이 WidgetTree이다.

WidgetTree는 재귀적으로 자식의 자식까지 검사하며, 전달해준 이름과 같은 이름을 가지는 위젯을 리턴한다.

auto widget =  WidgetTree->FindWidget("UMG_Helmet");
if(widget)
{
		UKismetSystemLibrary::PrintString(this,widget->GetName());
}

템플릿 함수로 한번 레핑해서 사용한다면 이후 위젯 관리가 수월해질 것.

  • WidgetTree는 UserWidget 내부 변수로 존재한다.