카테고리 없음

7/20 TIL

blog13869 2026. 7. 20. 19:44

[ 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 >