오늘은 BlueprintImplementableEvent 함수를 생성하려고 하는데 자꾸 빌드 오류가 발생하는 문제를 해결했음
블루프린트에서 구현할 수 있는 이벤트 함수를 만들려고 했는데, 컴파일 시점에서 계속 오버로드된 멤버 함수를 찾을 수 없다는 오류가 발생했음
알고 보니 UHT(Unreal Header Tool)가 자동으로 매개변수 타입을 변경하기 때문에 생긴 문제였음
블루프린트에서 구현할 함수를 만들려고 UFUNCTION을 작성했는데 빌드가 계속 실패했음
시도했던 코드:
UFUNCTION(BlueprintImplementableEvent, Category = "Tutorial")
void SetButtonText(UCommonButtonBase* Button, FText Text);
발생한 빌드 오류:
error C2511: 'void UGS_TutorialWidget::SetButtonText(UCommonButtonBase*, const FText&)':
overloaded member function not found in 'UGS_TutorialWidget'
함수 시그니처가 다르다고 나오는데 분명히 똑같이 작성했는데 왜 안되는지 이해할 수 없었음
첫 번째 단서: .gen.cpp 파일 확인
빌드 오류 메시지를 자세히 보니 generated 파일에서 문제가 발생하고 있었음
두 번째 단서: 매개변수 타입 불일치
// 내가 작성한 코드
void SetButtonText(UCommonButtonBase* Button, FText Text);
// UHT가 생성한 코드 (.gen.cpp)
void SetButtonText(UCommonButtonBase* Button, const FText& Text);
핵심 문제 발견
FText → const FText& (값 타입 → const 참조 타입)UHT가 자동으로 생성하는 코드 패턴
static FName NAME_UGS_TutorialWidget_SetButtonText = FName(TEXT("SetButtonText"));
void UGS_TutorialWidget::SetButtonText(UCommonButtonBase* Button, const FText& Text)
{
GS_TutorialWidget_eventSetButtonText_Parms Parms;
Parms.Button = Button;
Parms.Text = Text;
ProcessEvent(FindFunctionChecked(NAME_UGS_TutorialWidget_SetButtonText), &Parms);
}
타입 변환 대상
FText, FString, FNameTArray<T>, TMap<K,V>, TSet<T>변환되지 않는 타입들
int32, float, bool)UObject* 등)기존 방식 (실패)
UFUNCTION(BlueprintImplementableEvent, Category = "Tutorial")
void SetButtonText(UCommonButtonBase* Button, FText Text); // 값 타입
개선된 방식 (성공)
UFUNCTION(BlueprintImplementableEvent, Category = "Tutorial")
void SetButtonText(UCommonButtonBase* Button, const FText& Text); // const 참조 타입
다른 함수들도 함께 수정
// FString도 const 참조로 변경
UFUNCTION(BlueprintImplementableEvent, Category = "Tutorial")
void UpdateTutorialContent(const FString& Title, const FString& Description);
// bool과 포인터는 그대로 유지
UFUNCTION(BlueprintImplementableEvent, Category = "Tutorial")
void ChangeButtonState(UCommonButtonBase* Button, bool bIsCurrentPage);
빌드가 성공적으로 완료되고, 블루프린트에서 함수 구현이 가능해졌음!
근데 정확한 이유는 아직도 모르겠음..