[ PROJECT F ]
오늘의 구현 목록
Grenade 쿨타임 호출용 함수 추가
더보기
[ PFPlayerController ]
< 헤더 파일 선언 >
void UpdateGrenadeCooldownUI(float GrenadeCooldown);
< 소스 파일 구현 >
void APFPlayerController::UpdateGrenadeCooldownUI(float GrenadeCooldown)
{
if (HUDWidgetInstance == nullptr) return;
FOutputDeviceNull Ar;
FString Command = FString::Printf(TEXT("UpdateGrenadeCooldownUI %f"), GrenadeCooldown);
HUDWidgetInstance->CallFunctionByNameWithArguments(*Command, Ar, nullptr, true);
}
[ PFCombatComponent ] // 작성 요쳥
< 헤더 파일 선언 >
protected:
UPROPERTY(EditAnywhere, Category = "Combat")
float GrenadeCooldown = 5.0f;
bool bIsGrenadeOnCooldown = false;
FTimerHandle GrenadeCooldownTimerHandle;
void ResetGrenadeCooldown() { bIsGrenadeOnCooldown = false; };
< 소스 파일 구현 >
void UPFCombatComponent::ExecuteThrow()
{
AActor* Owner = GetOwner();
ACharacter* Character = Cast<ACharacter>(Owner);
if (!Character || !GrenadeClass || GrenadeCount <= 0 || bIsGrenadeOnCooldown) return;
if (HandGrenadeMesh)
{
HandGrenadeMesh->SetVisibility(false);
}
GrenadeCount--;
FVector SpawnLocation = Character->GetMesh()->GetSocketLocation(HandSocketName);
FRotator SpawnRotation = Character->GetControlRotation();
FActorSpawnParameters SpawnParams;
SpawnParams.Owner = Owner;
SpawnParams.Instigator = Character;
GetWorld()->SpawnActor<APFGrenade>(GrenadeClass, SpawnLocation, SpawnRotation, SpawnParams);
bIsGrenadeOnCooldown = true;
APFPlayerController* PlayerController = Cast<APFPlayerController>(Character->GetController());
if (PlayerController)
{
PlayerController->UpdateGrenadeCooldownUI(GrenadeCooldown);
}
GetWorld()->GetTimerManager().SetTimer(
GrenadeCooldownTimerHandle,
this,
&UPFCombatComponent::ResetGrenadeCooldown,
GrenadeCooldown,
false
);
}
GameClear 함수 작성 및 최종 구현 완료
더보기

< PFGameMode.cpp >
void APFGameMode::OnMonsterKilled()
{
if (!PFGameState) return;
PFGameState->OnMonsterKilled();
UE_LOG(LogTemp, Log, TEXT("몬스터 처치! 남은 몬스터: %d"), PFGameState->GetRemainingMonsters());
if (PFGameState->GetRemainingMonsters() <= 0)
{
// 🔥 4레벨 3웨이브(최종 보스)를 잡았는지 확인
if (PFGameState->GetCurrentLevel() == 4 && PFGameState->GetCurrentWave() == 3)
{
APFPlayerController* PlayerController = Cast<APFPlayerController>(GetWorld()->GetFirstPlayerController());
if (PlayerController)
{
PlayerController->ShowGameOver(true); // true = 게임 클리어!
} // true = 승리/게임클리어!
}
else
{
WaveClear(); // 다음 웨이브 진행
}
}
}
void APFGameMode::GameOver()
{
GetWorldTimerManager().ClearTimer(PFTimerHandle);
UE_LOG(LogTemp, Warning, TEXT("Game Over!"));
if (APFPlayerController* PlayerController = Cast<APFPlayerController>(GetWorld()->GetFirstPlayerController()))
{
PlayerController->ShowGameOver(false);
}
}
< PFPlayerController.h >
UPROPERTY(EditDefaultsOnly, Category = "UI")
TSubclassOf<UUserWidget> GameClearWidgetClass;
< PFPlayerController.cpp >
void APFPlayerController::ShowGameOver(bool bIsClear)
{
if (HUDWidgetInstance)
{
HUDWidgetInstance->RemoveFromParent();
HUDWidgetInstance = nullptr;
}
// bIsClear 조건에 따라 띄울 위젯 클래스 결정
TSubclassOf<UUserWidget> TargetWidgetClass = bIsClear ? GameClearWidgetClass : GameOverWidgetClass;
// 위젯 생성 및 화면 표시
if (TargetWidgetClass)
{
GameOverWidgetInstance = CreateWidget<UUserWidget>(this, TargetWidgetClass);
if (GameOverWidgetInstance)
{
GameOverWidgetInstance->AddToViewport();
// 마우스 커서 활성화 및 UI 입력 모드로 전환
bShowMouseCursor = true;
FInputModeUIOnly InputModeData;
InputModeData.SetWidgetToFocus(GameOverWidgetInstance->TakeWidget());
SetInputMode(InputModeData);
}
}
}
< BP_PFPlayerController >
