- 머리위에 체력표시
- 메뉴창 끝날 때 게임오버 텍스트 출력 및 애니메이션 적용
- 총점 표시



UI 애니메이션 생성하기







재생하면 깜빡거리는 효과가 적용된다.

UI 애니메이션 설정하기





SpartaController.cpp 수정
ShowMainMenu 함수를 수정한다.
if (UTextBlock* ButtonText = Cast<UTextBlock>(MainMenuWidgetInstance->GetWidgetFromName(TEXT("StartButtonText"))))
{
// 시작과 재시작 구분
if (bIsRestart)
{
ButtonText->SetText(FText::FromString(TEXT("Restart")));
}
else
{
ButtonText->SetText(FText::FromString(TEXT("Start")));
}
}
if (bIsRestart)
{
UFunction* PlayAnimFunc = MainMenuWidgetInstance->FindFunction(FName("PlayGameOverAnim")); // PlayGameOverAnim이라는 이름을 가진 함수 찾아서 저장
if (PlayAnimFunc)
{
MainMenuWidgetInstance->ProcessEvent(PlayAnimFunc, nullptr); // 인자가 없는 함수일 경우에는 nullptr 붙이고 ProcessEvent로 실행한다.
if (UTextBlock* TotalScoreText = Cast<UTextBlock>(MainMenuWidgetInstance->GetWidgetFromName("TotalScoreText")))
{
if (USpartaGameInstance* SpartaGameInstance = Cast <USpartaGameInstance>(UGameplayStatics::GetGameInstance(this)))
{
TotalScoreText->SetText(FText::FromString(FString::Printf(TEXT("Total Score: %d"), SpartaGameInstance->TotalScore)));
}
}
}
}
테스트를 위해 GameState에서 LevelDuration을 10초로 변경한다.
ASpartaGameState::ASpartaGameState()
{
// 변수 초기화
Score = 0;
SpawnedCoinCount = 0;
CollectedCoinCount = 0;
LevelDuration = 10.0; // 30-> 테스트를 위해 10으로 변경
CurrentLevelIndex = 0;
MaxLevels = 3;
}

캐릭터 위에 체력바 구현하기
3D Widget Component 구현




위젯 붙이기
UI는 스크린과 월드의 두 종류가 있다.
스크린은 항상 화면에 평면적으로 표시하는 것이고, 월드는 각도에 따라 달라보이게 만든 것이다. 따라서 2D처럼 3D UI를 적용하기 위해서는 스크린 모드로 고정해주어야한다.
SpartaCharacter.h
public:
// Sets default values for this character's properties
ASpartaCharacter();
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera")
USpringArmComponent* SpringArmComp;
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Camera")
UCameraComponent* CameraComp;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI")
UWidgetComponent* OverheadWidget; // 위젯 컴포넌트
UFUNCTION(BlueprintPure, Category = "Health")
float GetHealth() const;
UFUNCTION(BlueprintCallable, Category = "Health")
void AddHealth(float Amount);
void UpdateOverhaedHP(); // HP 위젯을 업데이트 해준다.
void BeginPlay() override;
cpp
void ASpartaCharacter::UpdateOverhaedHP()
{
if (!OverheadWidget) return;
UUserWidget* OverheadWidgetInstance = OverheadWidget->GetUserWidgetObject();
if (!OverheadWidgetInstance) return;
if (UTextBlock* HPText = Cast<UTextBlock>(OverheadWidgetInstance->GetWidgetFromName(TEXT("OverHeadHP"))))
{
HPText->SetText(FText::FromString(FString::Printf(TEXT("%0.f / %.0f"), Health, MaxHealth)));
}
}




체력이 0 이하가 되었을 때 게임 오버
SpartaGameState.cpp
void ASpartaGameState::OnGameOver()
{
// UpdateHUD();
// UE_LOG(LogTemp, Warning, TEXT("Game Over!!"));
// MainMenu UI 열기
if (APlayerController* PlayerController = GetWorld()->GetFirstPlayerController())
{
if (ASpartaPlayerController* SpartaPlayerController = Cast<ASpartaPlayerController>(PlayerController))
{
SpartaPlayerController->SetPause(true); // 일시정지
SpartaPlayerController->ShowMainMenu(true); // 레벨이 오픈될 때마다 UI는 HUD로 전환
}
}
}
SpartaPlayerController.cpp
void ASpartaPlayerController::StartGame()
{
// 시작시 인스턴스 초기화
if (USpartaGameInstance* SpartaGameInstance = Cast<USpartaGameInstance>(UGameplayStatics::GetGameInstance(this)))
{
SpartaGameInstance->CurrentLevelIndex = 0;
SpartaGameInstance->TotalScore = 0;
}
UGameplayStatics::OpenLevel(GetWorld(), FName("BasicLevel")); // 월드에 BasicLevel 오픈
SetPause(false); // 일시정지 해제
}
'게임 개발 > 학습 일지' 카테고리의 다른 글
| 언리얼 C++ - 파티클과 사운드로 게임 효과 연출하기 (0) | 2026.04.30 |
|---|---|
| 언리얼 엔진 심화 3주차 - 콜리전, 트레이스 및 데미지 타입 (0) | 2026.04.30 |
| 언리얼 C++ - UI 위젯 설계와 실시간 데이터 연동하기 (0) | 2026.04.27 |
| 언리얼 C++ - State Machine 설계를 통한 캐릭터 동작 애니메이션 적용하기 (0) | 2026.04.24 |
| 언리얼 C++ - 캐릭터 체력 및 점수 관리 시스템 구현하기 (0) | 2026.04.23 |