(Feat) Fix Fade Loading

This commit is contained in:
2026-08-03 21:10:45 +02:00
parent 7595df6862
commit 1456ed91c7
11 changed files with 925 additions and 28 deletions
@@ -55,6 +55,15 @@ void AMainMenuPlayerController::BeginPlay()
UE_LOG(LogTemp, Warning, TEXT("AMainMenuPlayerController : aucune AMenuCameraSpot active dans la map, le menu s'affichera sur la vue par defaut."));
}
// APRES SetViewTarget, jamais avant : les images de chauffe doivent etre
// rendues depuis l'angle qu'on va reellement montrer, sinon elles raffinent
// un decor qu'on ne verra pas. Le voile est deja noir, donc rien ne fuit.
USurvivalGameInstance* SurvivalGameInstance = GetGameInstance<USurvivalGameInstance>();
if (SurvivalGameInstance)
{
SurvivalGameInstance->ResumeWorldRendering();
}
if (MainMenuClass)
{
MainMenu = CreateWidget<UMainMenuWidget>(this, MainMenuClass);
@@ -78,12 +87,31 @@ void AMainMenuPlayerController::BeginPlay()
SetShowMouseCursor(true);
ScreenFade->OnFadeFinished.AddDynamic(this, &AMainMenuPlayerController::HandleFadeFinished);
// Meme raison qu'en jeu : on laisse le decor rendre quelques images derriere
// le voile noir avant de l'eclaircir, le temps que Nanite et les textures
// virtuelles se raffinent. Sans ca on voit le terrain passer de sa version
// grossiere a la vraie, et les modeles apparaitre un a un.
if (SurvivalGameInstance)
{
SurvivalGameInstance->BeginSceneWarmup(
FSimpleDelegate::CreateUObject(this, &AMainMenuPlayerController::StartOpeningFade));
}
else
{
StartOpeningFade();
}
}
void AMainMenuPlayerController::StartOpeningFade()
{
ScreenFade->FadeIn(OpeningFadeDuration);
if (USessionSubsystem* Sessions = GetGameInstance() ? GetGameInstance()->GetSubsystem<USessionSubsystem>() : nullptr)
{
Sessions->OnHostFailed.AddDynamic(this, &AMainMenuPlayerController::HandleHostFailed);
Sessions->OnJoinFailed.AddDynamic(this, &AMainMenuPlayerController::HandleJoinFailed);
Sessions->OnTravelPending.AddDynamic(this, &AMainMenuPlayerController::HandleTravelPending);
// Revenir au menu depuis une partie laisse la session ouverte : elle
// resterait annoncee a tes amis alors que plus personne n'est dedans.
@@ -91,6 +119,14 @@ void AMainMenuPlayerController::BeginPlay()
UE_LOG(LogTemp, Log, TEXT("AMainMenuPlayerController : service en ligne [%s]."), *Sessions->GetOnlineServiceName());
}
// On est arrive : le filet de secours reseau redevient actif pour la
// prochaine partie. Sans cette remise a zero, un hote qui relance apres
// avoir quitte ne serait plus jamais ramene au menu en cas de coupure.
if (USurvivalGameInstance* SurvivalGameInstance = GetGameInstance<USurvivalGameInstance>())
{
SurvivalGameInstance->ClearReturnToMainMenu();
}
}
AMenuCameraSpot* AMainMenuPlayerController::PickCameraSpot()
@@ -185,6 +221,31 @@ void AMainMenuPlayerController::HandleHostFailed(FText Reason)
UGameplayStatics::OpenLevelBySoftObjectPtr(this, GameLevel, /*bAbsolute=*/true, TEXT("listen"));
}
void AMainMenuPlayerController::HandleTravelPending()
{
USessionSubsystem* Sessions = GetGameInstance() ? GetGameInstance()->GetSubsystem<USessionSubsystem>() : nullptr;
if (!Sessions)
{
return;
}
// Le menu reste lisible pendant le fondu mais cesse de repondre : cliquer
// Jouer alors qu'on part deja rejoindre un ami serait un piege.
if (MainMenu)
{
MainMenu->SetVisibility(ESlateVisibility::HitTestInvisible);
}
// Exactement la duree que le sous-systeme attend : fondre plus lentement
// laisserait voyager avant que l'ecran soit noir, plus vite laisserait un
// ecran noir immobile.
ScreenFade->FadeOut(Sessions->GetTravelFadeDuration());
// PendingAction reste a None VOLONTAIREMENT : ce n'est pas nous qui
// chargerons la map, c'est le sous-systeme. HandleFadeFinished doit donc ne
// rien faire quand ce fondu-la se termine.
}
void AMainMenuPlayerController::HandleJoinFailed(FText Reason)
{
UE_LOG(LogTemp, Error, TEXT("AMainMenuPlayerController : connexion impossible -- %s"), *Reason.ToString());