2026-04-10(금) UGameplayStatics, NativeConstruct, TransitionWidgetInstance

조범근·2026년 4월 10일

TIL

목록 보기
41/81

C++ Week 7

Study

언리얼C++ 기초, 알고리즘 1문제


Today I Learned


Unreal C++

UGameplayStatics::GetGameInstance()

GetGameInstnace()는 내부적으로 UGameplayStatics의 기능을 호출하는 편의 기능(Helper)이다.

AActorUUserWidget 같은 클래스들은 내부적으로 GetGameInstance()라는 함수를 미리 가지고 있다. 이 함수를 타고 들어가 보면 결국 UGameplayStatics::GetGameInstance(GetWorld())를 호출하는 구조다.
그래서 GetGameInstance()처럼 현재 클래스가 AActorUWidget처럼 월드 맥락(World context)을 알고 있는 클래스를 상속받았을 때만 쓸 수 있는 것과 달리,
UGameplayStatics::GetGameInstance(this)UObject를 상속받은 순수 데이터 클래스, 커스텀 UDataAsset, 혹은 static함수 내부에서는 GetGameInstance()를 바로 호출할 수없는 것들은 자신이 어떤 월드(레벨)에 속해 있는지 스스로 알지 못하는 곳에 쓰면 된다.


Widget 관리

	HUDWidgetInstance->RemoveFromParent();
    HUDWidgetInstance = nullptr;

CreateWidget<T>(...) -> C++ 의 new동적할당과 비슷하지만, 언리얼 메모리 관리 시스템(GC)에 등록하며 위젯 인스턴스를 메모리에 할당한다.

RemoveFromParent() -> 부모 위젯이나 뷰포트에서 연결을 끊는 함수이다. 핵심은 nullptr처리이다. 언리얼의 가비지 컬렉터는 참조 카운트가 0이 되어야 메모리를 해제한다. 연결을 끊은 뒤 변수에 nullptr을 대입해야 안 쓰는 객체라고 GC에게 알려줄 수 있다.
delete 처럼 두개는 세트


NativeConstruct

UUserWidget을 상속받은 위젯 클래스는 C++ 생성자 단계에서 내부 컴포넌트(버튼, 텍스트 등)가 완전히 로드되지 않을 수 있다. 그래서 생성자를 적지 않고 NativeConstruct를 쓴다. 모든 UI 요소가 준비된 직후 호출되므로 생성자처럼 초기화 로직을 넣기에 가장 적절한 장소다.


HUD 자동 갱신

TimerHandle을 새로 만들어서 0.1초마다 UpdateHUD를 호출하도록 예약해두었기 때문에, 점수를 먹거나 데미지를 입을 때 일일이 함수를 부르지 않아도 타이머가 0.1초마다 현재 상태를 체크해서 UI를 갱신하고 있는 것.
이걸 Polling(폴링) 방식이라고 한다.


Polling은 권장하는 방식일까

수천 개의 위젯이 동시에 체크하면 문제가 될 수 있지만, 메인 HUD하나라면 성능 상 상관이 없다. 하지만 데미지를 입는 순간에만 UI를 갱신하는 것이 더 정교하고 최적화된 설계라고 한다. 잘몰루겠음



0개의 댓글