Make Unreal REAL.
article thumbnail

이득우 교수님의 <이득우의 언리얼 C++ 게임 개발의 정석> 391p를 보면 다음과 같은 내용이 있다.

 

이때 한 가지 고려할 사항은 UI가 초기화되는 시점이다. UI 시스템이 준비되면 NativeConstruct 함수가 호출되는데, UI 생성은 플레이어 컨트롤러의 BeginPlay에서 호출되므로 BeginPlay 전에 호출된 PostInitializeComponents 함수에서 발생한 명령은 UI에 반영되지 않는다. 따라서 현재 구조에서는 NativeConstruct 함수에서 위젯 내용을 업데이트하는 로직을 구현하는 것이 필요하다.

 

솔직히 이 문단을 몇 번이나 반복해서 읽어도 이해가 되지 않았다.

말씀해주신 내용과 코드가 매치가 안 되었기 때문이다.

 

UWidgetComponent::SetWidgetClass() 함수로 위젯 클래스를 지정해주는 코드는 플레이어 컨트롤러의 BeginPlay() 함수가 아니라 캐릭터의 생성자에 있었다.

 

나름대로 알아서 이해하고 난 후 찝찝한 느낌으로 다음 내용을 공부 중이었는데, 다시금 언리얼은 엔진 코드를 제공한다는 것이 떠올라 들여다 보기로 했다.

 

 

SetWidgetClass() 함수는 Play가 시작된 이후에 호출되면 위젯 생성까지 시켜주고, Play 전이면 위젯 클래스만 설정해주는 함수였다.

 

현재 Play 전에 생성자에서 SetWidgetClass() 함수가 실행되었음에도 위젯이 생성되는 것을 보면, 이 소스 파일 어딘가에 분명히 CreateWidget() 함수를 호출하는 부분이 또 존재할 것이다.

 

 

찾았다..

 

Play 전에 SetWidgetClass() 함수가 호출되어 위젯이 생성되지 않았으면 생성하는 함수다.

 

내 의문점을 해결하기 위해서는 UWidgetComponent 위젯이 실제로 생성되는 시점을 알아야 했다.

 

InitWidget() 함수를 호출하는 부분을 찾으면 된다.

 

 

찾았다 ! !

 

 

결국 Play 전에 호출된 UComponent::SetWidgetClass() 함수는 위젯 클래스만 설정해 두었다가, BeginPlay() 시에 위젯을 생성한다는 것을 확인했다.

 

이득우 교수님께서는 아마 실습했던 UWidgetComponent에 대해 말씀하셨던 것이 아니라, 뷰포트에 띄우는 UUserWidget에 대해 말씀하셨던 것 같다.

  • 뷰포트에 띄우기 위해 CreateWidget() 함수를 실행할 때 Player Controller를 전달해야 하기 때문에, 플레이어 컨트롤러에서 위젯 생성 코드를 작성하는 것이 일반적이다.
  • 하지만 Player Controller만 가져올 수 있다면 다른 곳에서 생성해도 상관은 없다.

 

컨트롤러가 플레이어 컨트롤러인지 확인할 수 있는 OnPossess(), PossessedBy(), PostLogin() 함수에서도 위젯을 생성할 수 있을 것 같다.

 

또 하나 알게된 것이 있다.

 

뷰포트에 띄우는 User Widget UI는 CreateWidget() 함수의 OwningObject에 Player Controller를 전달하지만, 액터에 컴포넌트로 붙이는 Widget Component UI는 World를 전달해 실제로는 액터가 아닌 월드가 위젯의 소유자가 된다는 것이다.

profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그