[25.06.27] :: 가디언 앤 시커 프로젝트 18

chooha·2025년 6월 27일

가디언앤시커

목록 보기
18/25

📝 개발일지 - BlueprintImplementableEvent 빌드 오류 문제

👨‍💻 오늘의 개발 작업

오늘은 BlueprintImplementableEvent 함수를 생성하려고 하는데 자꾸 빌드 오류가 발생하는 문제를 해결했음

블루프린트에서 구현할 수 있는 이벤트 함수를 만들려고 했는데, 컴파일 시점에서 계속 오버로드된 멤버 함수를 찾을 수 없다는 오류가 발생했음

알고 보니 UHT(Unreal Header Tool)가 자동으로 매개변수 타입을 변경하기 때문에 생긴 문제였음


💡 오늘의 5분 기록

1. 문제 확인 - BlueprintImplementableEvent 빌드 실패

블루프린트에서 구현할 함수를 만들려고 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'

함수 시그니처가 다르다고 나오는데 분명히 똑같이 작성했는데 왜 안되는지 이해할 수 없었음

2. 원인 파악 - UHT의 자동 타입 변환

첫 번째 단서: .gen.cpp 파일 확인
빌드 오류 메시지를 자세히 보니 generated 파일에서 문제가 발생하고 있었음

두 번째 단서: 매개변수 타입 불일치

// 내가 작성한 코드
void SetButtonText(UCommonButtonBase* Button, FText Text);

// UHT가 생성한 코드 (.gen.cpp)
void SetButtonText(UCommonButtonBase* Button, const FText& Text);

핵심 문제 발견

  • UHT가 BlueprintImplementableEvent를 위한 코드를 자동 생성함
  • 이때 특정 타입들을 const 참조 타입으로 자동 변환함
  • FTextconst FText& (값 타입 → const 참조 타입)
  • 헤더 파일의 선언과 생성된 구현부의 시그니처가 달라져서 빌드 실패

3. UHT 동작 방식 이해

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, FName
  • TArray<T>, TMap<K,V>, TSet<T>
  • 구조체 타입들

변환되지 않는 타입들

  • 기본 타입 (int32, float, bool)
  • 포인터 타입 (UObject* 등)
  • 열거형 타입

4. 해결 과정 - const 참조 타입 사용

기존 방식 (실패)

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);

5. 성과와 깨달은 점

빌드가 성공적으로 완료되고, 블루프린트에서 함수 구현이 가능해졌음!
근데 정확한 이유는 아직도 모르겠음..


참고 자료

0개의 댓글