2026-05-06(수)

조범근·2026년 5월 6일

TIL

목록 보기
54/81

C++ Week 11

Study

팀플, 알고리즘 1문제



Today I Learned


UnrealC++

1. AddDynamic과 AddUniqueDynamic

StartButton->OnClicked.AddDynamic(this, &ThisClass::HandleStartClicked);
StartButton->OnClicked.AddUniqueDynamic(this, &ThisClass::HandleStartClicked);

AddDynamicAddUniqueDynamic은 둘 다 언리얼의 Dynamic Multicast Delegate에 함수를 등록할 때 사용한다.

둘의 차이는 중복 바인딩을 허용하느냐이다.
AddDynamic은 같은 객체의 같은 함수가 이미 등록되어 있어도 다시 추가한다.

StartButton->OnClicked.AddDynamic(this, &ThisClass::HandleStartClicked);
StartButton->OnClicked.AddDynamic(this, &ThisClass::HandleStartClicked);

이 경우 버튼을 한 번만 눌러도 HandleStartClicked()가 두번 호출 될 수 있다.
반면 AddUniqueDynamic은 같은 객체와 같은 하뭇 조합이 이미 등록되어 있으면 다시 추가하지 않는다.

UMG에서는 위젯의 생명주기 때문에 이벤트가 여러 번 바인딩될 가능성이 있다. 특히 NativeConstruct()는 위젯이 다시 화면에 나타날 때 여러 번 호출될 수 있다.

따라서 UI 이벤트 바인딩에서는 보통 AddUniqueDynamic을 이용하는 것이 안전하다.


2. OutGameUI에서 InputMode 설정 때문에 Possess가 안 된 것처럼 보이는 문제

언리얼에서 Possess는 Controller가 Pawn 또는 Character를 조종하도록 연결하는 과정이다.

기본 구조는 다음과 같다.

GameMode
-> PlayerController 생성
-> DefaultPawnClass 스폰
-> PlayerController가 Pawn을 Possess

FInputModeUIOnly inputMode;
SetInputMode(inputMode);
bShowMouseCursor = true;

이렇게 하면 입력이 게임 캐릭터가 아니라 UI쪽으로 향하기 때문에 UI에서는 정상적이다. 문제는 인게임 맵으로 넘어간 뒤에도 입력이 게임 쪽으로 돌아오지 않으면, 캐릭터가 Possess되어 있어도 움직이지 않는 것처럼 보일 수 있다.

따라서 UI 전용 입력 모드를 사용했다면, 인게임 진입 시 다시 게임 입력 모드로 돌려주는 것이 안전하다.

FInputModeGameOnly inputMode;
PlayerController->SetInputMode(inputMode);
PlayerController->bShowMouseCursor = false;

3. ComboBoxString, Slider의 Bind Handle

UMG에서 C++로 위젯 이벤트를 바인딩 할때는, 바인딩하려는 함수의 형태가 델리게이트 시그니처와 정확히 맞아야 한다.

버튼의 클릭 이벤트는 인자가 없다.따라서 Handle 함수도 인자가 없어야한다. 반면 Slider의 OnValueChnaged는 변경된 값을 `float으로 넘겨준다.

MouseSensitivitySlider->OnValueChanged.AddUniqueDynamic(
	this,
	&ThisClass::HandleMouseSensitivityChanged
);
// 따라서 Handle 함수는 float 인자를 받아야 한다.

UFUNCTION()
void HandleMouseSensitivityChanged(float value);

사운드 볼륨 Slider도 동일하다


GraphicsQualityComboBox->OnSelectionChanged.AddUniqueDynamic(
	this,
	&ThisClass::HandleGraphicsQualityChanged
);

UFUNCTION()
void HandleGraphicsQualityChanged(FString selectedItem, ESelectInfo::Type selectionType);

ComboBoxString의 OnSelectionChanged는 선택된 문자열과 선택 방식 정보를 넘긴다

0개의 댓글