팀플, 알고리즘 1문제
StartButton->OnClicked.AddDynamic(this, &ThisClass::HandleStartClicked);
StartButton->OnClicked.AddUniqueDynamic(this, &ThisClass::HandleStartClicked);
AddDynamic과 AddUniqueDynamic은 둘 다 언리얼의 Dynamic Multicast Delegate에 함수를 등록할 때 사용한다.
둘의 차이는 중복 바인딩을 허용하느냐이다.
AddDynamic은 같은 객체의 같은 함수가 이미 등록되어 있어도 다시 추가한다.
StartButton->OnClicked.AddDynamic(this, &ThisClass::HandleStartClicked);
StartButton->OnClicked.AddDynamic(this, &ThisClass::HandleStartClicked);
이 경우 버튼을 한 번만 눌러도 HandleStartClicked()가 두번 호출 될 수 있다.
반면 AddUniqueDynamic은 같은 객체와 같은 하뭇 조합이 이미 등록되어 있으면 다시 추가하지 않는다.
UMG에서는 위젯의 생명주기 때문에 이벤트가 여러 번 바인딩될 가능성이 있다. 특히 NativeConstruct()는 위젯이 다시 화면에 나타날 때 여러 번 호출될 수 있다.
따라서 UI 이벤트 바인딩에서는 보통 AddUniqueDynamic을 이용하는 것이 안전하다.
언리얼에서 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;
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는 선택된 문자열과 선택 방식 정보를 넘긴다