📍 4주차 3강
위치, 사이즈, 텍스트 수정하고 가운데 정렬까지
Behavior > Visibility : Hidden
처음에는 안 보이는 형태로 설정
Render Opacity
투명도 조절
Animations
| 시간 (초) | 값 |
|---|---|
| 0 | 1 |
| 0.5 | 0.5 |
| 1 | 1 |
| 1.5 | 0.5 |
| 2 | 1 |
→ 깜빡이는 애니메이션 생성
| 시간 (초) | 값 |
|---|---|
| 0 | 1 |
| 1 | 0.2 |
| 2 | 1 |
| 3 | 0.2 |
| 4 | 1 |
→ 더 잘 보이게 변경

1️⃣ 애니메이션을 재생시키기 위한 함수 만들기 - PlayGameOverAnim
2️⃣ GameOve TextButton을 변수로 만들기 - ☑ Is Variable
3️⃣ Set Visilbility 보이게 처리함
4️⃣ TotalScore도 Hidden, Is Variable → 숨기고 변수 처리
5️⃣ 함수 완성 
6️⃣ 코드에서 PlayerController.cpp 수정
// PlayerController.cpp
// 메인메뉴가 Start? Restart?
if (UTextBlock* ButtonText = Cast<UTextBlock>(MainMenuWidgetInstance->GetWidgetFromName(TEXT("StartButtonText"))))
{
if (bIsRestart)
{
ButtonText->SetText(FText::FromString(TEXT("Restart"))); // 이 때 GameOver Animation 호출해야 함
// 애니메이션 실행
UFunction* PlayAnimFunc = MainMenuWidgetInstance->FindFunction(FName("PlayGameOverAnim"));
if (PlayAnimFunc)
{
MainMenuWidgetInstance->ProcessEvent(PlayAnimFunc, nullptr); //PlayAnimFunc: 매개 변수 없는 함수는 두 번째 인자에 nullptr로 호출
}
}
else
{
ButtonText->SetText(FText::FromString(TEXT("Start")));
}
}
TotalScore 점수 제대로 출력 안 됨
// PlayerController.cpp
/ 메인메뉴가 Start? Restart?
if (UTextBlock* ButtonText = Cast<UTextBlock>(MainMenuWidgetInstance->GetWidgetFromName(TEXT("StartButtonText"))))
{
if (bIsRestart)
{
ButtonText->SetText(FText::FromString(TEXT("Restart"))); // 이 때 GameOver Animation 호출해야 함
}
else
{
ButtonText->SetText(FText::FromString(TEXT("Start")));
}
}
if (bIsRestart)
{
// 애니메이션 실행
UFunction* PlayAnimFunc = MainMenuWidgetInstance->FindFunction(FName("PlayGameOverAnim"));
if (PlayAnimFunc)
{
MainMenuWidgetInstance->ProcessEvent(PlayAnimFunc, nullptr); //PlayAnimFunc: 매개 변수 없는 함수는 두 번째 인자에 nullptr로 호출
}
// 점수 갖고오기
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)
));
}
}
}


// Character.h
// CameraComponent 아래에 붙이기
UCLASS()
class SPARTAPROJECT_API ASpartaCharacter : public ACharacter
{
public:
// ...
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "UI")
UWidgetComponent* OverheadWidget;
// ...
void UpdateOverheadHP();
};
// Character.cpp
ASpartaCharacter::ASpartaCharacter()
{
// ...
// Widget 붙이기
OverheadWidget = CreateDefaultSubobject<UWidgetComponent>(TEXT("OverheadWidget"));
OverheadWidget->SetupAttachment(GetMesh()); // 코드에는 Mesh 없으니까 가져오기
OverheadWidget->SetWidgetSpace(EWidgetSpace::Screen); // screen 모드
}
UpdateOverheadHP(); 아래 함수들에 추가
void ASpartaCharacter::BeginPlay()
void ASpartaCharacter::AddHealth(float Amount)
float ASpartaCharacter::TakeDamage()
void ASpartaCharacter::UpdateOverheadHP()
{
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("%.0f / %.0f"), Health, MaxHealth)));
}
}



// Character.cpp
#include "SpartaGameState.h"
void ASpartaCharacter::OnDeath()
{
ASpartaGameState* SpartaGameState = GetWorld() ? GetWorld()->GetGameState<ASpartaGameState>() : nullptr;
if (SpartaGameState)
{
SpartaGameState->OnGameOver();
}
}
// GameState.h
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Level")
float LevelDuration;
// GameState.cpp
void ASpartaGameState::OnGameOver()
{
if (APlayerController* PlayerController = GetWorld()->GetFirstPlayerController())
{
if (ASpartaPlayerController* SpartaPlayerController = Cast<ASpartaPlayerController>(PlayerController))
{
SpartaPlayerController->SetPause(true); // ✅ 게임이 완전히 정지될 수 있게 게임 자체를 멈추기
SpartaPlayerController->ShowMainMenu(true); // Restart bool : true
}
}
}
// PlayerController.cpp
void ASpartaPlayerController::StartGame()
{
// GameInstance에 있는 정보들 초기화
if (USpartaGameInstance* SpartaGameInstance = Cast<USpartaGameInstance>(UGameplayStatics::GetGameInstance(this)))
{
SpartaGameInstance->CurrentLevelIndex = 0;
SpartaGameInstance->TotalScore = 0;
}
// 지금은 UI 전용 Level에 있음
// BasicLevel 오픈해라~
UGameplayStatics::OpenLevel(GetWorld(), FName("BasicLevel"));
SetPause(false); // ✅ 추가
}
MineItem 오버랩 해도 HP 반영 안 됨
→ Character.h / Character.cpp 에서 BeginPlay() 없었음....