📌 Main Menu WBP에서 애니메이션 효과 생성
- GameOver 텍스트와 TotalScore 텍스트를 생성하고 위치를 잡기
- 두 TextBlock 모두 "is Variabl" 체크를 해주고 Behavior 탭에 Visibility를 "Hidden" 으로 변경해 숨김 처리
- 게임 시작하는 단계에서는 GameOver 텍스트와 TotalScore 텍스트가 보여지지 않아야 한다.
- 따라서 두 텍스트 모두 변수로 만들어 이 텍스트들을 게임이 종료될 때 보여지도록 설정하는 함수를 만들 예정
- 애니메이션을 설정할 GameOver TextBlock을 클릭한 뒤 하단의 Animations 창 왼족에 "+ Animation" 버튼을 클릭해
새 애니메이션을 만들어준다. - 그 다음 우측 창에서 "+ Add" 버튼을 클릭해 "GameOver Text"에 "Render Opacity"를 추가한다.
- 우측 타임라인에서 0.0초에 1.0 → 1.0초에 0.2 → 2.0초에 1.0 의 값을 반복해서 설정하면 텍스트가 깜빡이는 연출을 할 수 있다.
- 우측에 "Graph" 버튼을 클릭하면 EventGraph 창으로 전환
- 좌측 Functions 카테고리에서 "PlayGameOverAnim" 이라는 함수를 생성
- 아래 Animation 카테고리를 살펴보면 방금 만들었던 Anim_TimeOver 애니메이션이 있는 것을 확인할 수 있고,
TextBlock에 "is Variable" 체크를 해놨기 때문에 GameOverText와 TotalScoreText까지 있는 것을 확인할 수 있다. - "PlayGameOverAnim" 함수를 더블 클릭
- 함수 내부로 들어와서 이 함수가 호출되었을 때, GameOver Text와 TotalScore Text를 "Visibility"로 설정하여 보여질 수 있도록 한다.
- GameOver Text의 경우 PlayAnimation 노드를 연결해 방금 만들어주었던 Anim Time Over 애니메이션을 연결해주었다.
📌 PlayerController에서 WBP에서 만든 함수 호출
✅ PlayerController.cpp
void AStrikeZonePlayerController::ShowMainMenu(bool bIsReStart)
{
/* 생략 */
if (bIsReStart)
{
UFunction* PlayAnimFunc = MainMenuWidgetInstance->FindFunction(FName("PlayGameOverAnim"));
if (PlayAnimFunc)
{
MainMenuWidgetInstance->ProcessEvent(PlayAnimFunc, nullptr);
}
if (UTextBlock* TotalScoreText = Cast<UTextBlock>(MainMenuWidgetInstance->GetWidgetFromName("TotalScoreText")))
{
if (USZ_GameInstance* GameInstance = Cast<USZ_GameInstance>(UGameplayStatics::GetGameInstance(this)))
{
TotalScoreText->SetText(FText::FromString(FString::Printf(TEXT("Total Score: %d"), GameInstance->TotalScore)));
}
}
}
}
- ShowMainMenu( ): 메인 메뉴가 노출되어야 되는 상황일 때 호출되는 함수
- bIsRestart: 초기 게임 시작이 아닌, 게임오버 상황을 의미
- MainMenuInstance에서 UObject::FindFunction() 함수로 WBP에서 만들었던 함수를 가져와 저장한다.
- UOject::ProcessEvent() 함수로 WBP의 애니메이션 재생 함수를 호출한다.
- TotalScore 점수를 GameInstance에서 가져와 SetText 해주었다.
🔎 UObject::FindFunction과 UObject::ProcessEvent 정리
언리얼 엔진에서 주로 함수 호출과 이벤트 처리를 동적으로 다룰 때 사용된다.
특히 런타임 시점에서 함수의 존재 여부를 확인하거나 이벤트를 실행할 때 유용하며, 플러그인 시스템이나 모듈 간의 동적 호출에서 자주 사용된다.
✅ UObject::FindFunction(FName InName)
주어진 함수 이름(FName)을 기반으로 해당 UObject에 해당 함수가 있는지 찾는다.
UFunction* FindFunction(FName FunctionName) const;
🟢 FindFunction의 장점
- 동적 함수 확인 가능: 런타임 시점에서 함수가 존재하는지 확인할 수 있다.
- 안전한 호출: 함수가 존재하지 않을 경우 nullptr을 반환하므로 안전한 조건부 호출이 가능하다.
🔴 FindFunction의 단점
- 비용 발생 가능: 런타임에 함수 탐색을 수행하기 때문에 빈번한 호출 시 성능에 부담을 줄 수 있다.
- 정적 타입 안전성 부족: 컴파일 타임에 타입 검증이 되지 않으므로 잘못된 함수명을 사용할 위험이 있다.
✅ UObject::ProcessEvent
UFunction 포인터와 파라미터 구조체 를 받아 런타임에 동적으로 함수를 호출하는 기능을 제공한다.
UFunction 메타데이터를 기반으로 호출하며, 호출할 함수가 블루프린트에 구현되어 있다면 그 블루프린트 구현 함수를 호출하고 만약 블루프린트에 해당 함수가 없고 C++에 정의된 함수가 있다면 C++ 함수가 호출된다.
다만 호출할 함수가 UFUNCTION 매크로로 선언된 함수여야 리플렉션 시스템에 등록되어 메타데이터 정보를 읽을 수 있다.
void ProcessEvent(UFunction* Function, void* Parameters);
🟢 ProcessEvent의 장점
- 동적 함수 호출: 런타임에 함수명을 몰라도 FindFunction으로 찾은 UFunction을 기반으로 호출할 수 있다.
- Reflection 시스템 통합: 언리얼의 리플렉션 시스템을 활용해 외부 데이터나 이벤트를 처리할 수 있다.
- 블루프린트 함수 호출 가능: 블루프린트에서 정의된 함수도 호출할 수 있어 C++ ↔ 블루프린트 간 상호작용이 가능하다.
🔴 ProcessEvent의 단점
- 비정적 호출: 정적 함수 호출보다 성능이 떨어질 수 있다. 런타임 탐색과 호출로 인해 비용이 증가한다.
- 디버깅 어려움: 런타임에 호출되므로 호출 시 오류가 발생할 경우 원인을 찾기 어려울 수 있다.
'내배캠 > Unreal Engine' 카테고리의 다른 글
Particle과 Sound 효과 연출 (0) | 2025.02.07 |
---|---|
Widget Component로 월드에 UI 배치하기 (0) | 2025.02.07 |
게임 메뉴 UI 디자인 / 게임 흐름에 맞게 UI 전환 (0) | 2025.02.06 |
UI 위젯 설계와 실시간 데이터 연동 (0) | 2025.02.06 |
Game State와 Game Mode (0) | 2025.02.04 |