// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Engine/GameInstance.h" #include "SurvivalGameInstance.generated.h" class UInputMappingContext; class ULocalPlayer; /** * Le seul objet qui survit aux changements de map. * * C'est l'equivalent le plus proche d'un singleton DontDestroyOnLoad d'Unity : * il naƮt au lancement du jeu et meurt a sa fermeture. Tout le reste -- * GameMode, GameState, PlayerController, pawns, widgets -- est detruit et * recree a chaque OpenLevel. * * Y mettre : les reglages, la sauvegarde en cours, et plus tard l'hebergement * et le rejoindre-une-partie. Surtout pas d'etat de gameplay, qui appartient au * monde et doit disparaitre avec lui. */ UCLASS() class SURVIVAL_PROJET_API USurvivalGameInstance : public UGameInstance { GENERATED_BODY() public: virtual void Init() override; /** Nom de la derniere camera de menu utilisee. NAME_None au premier lancement. */ UFUNCTION(BlueprintPure, Category = "Menu") FName GetLastMenuCameraName() const { return LastMenuCameraName; } UFUNCTION(BlueprintCallable, Category = "Menu") void SetLastMenuCameraName(FName SpotName) { LastMenuCameraName = SpotName; } /** * Declare les IMC remappables aupres des reglages d'input du joueur. * * Appelee A LA DEMANDE, par l'ecran de reglages avant de lire les touches, et * non depuis un evenement de demarrage. Raison : UserSettings n'est cree que * dans UEnhancedInputLocalPlayerSubsystem::PlayerControllerChanged, et * ULocalPlayer diffuse ses evenements AVANT de prevenir ses sous-systemes -- * tout hook precoce arrive donc trop tot, quel qu'il soit. * * Idempotente : le moteur ignore un contexte deja connu. */ UFUNCTION(BlueprintCallable, Category = "Input") void RegisterMappableContexts(); protected: /** * Les mapping contexts dont les touches sont remappables. Mets-y IMC_Default. * * Ici et PAS sur le pawn : le menu principal n'a aucun pawn, et l'ecran de * reglages doit pourtant afficher les touches. C'est le critere habituel -- * "est-ce que ca doit survivre au changement de map ?" -- qui envoie cette * liste sur le GameInstance. */ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Input") TArray> MappableContexts; private: /** * Stocke un NOM et pas un index : les index changent des qu'on ajoute ou * supprime une camera dans la map, et on retomberait sur autre chose. * * Ne sert qu'a eviter de retirer deux fois de suite le meme angle quand le * joueur revient au menu -- d'ou le Transient, ca n'a pas a etre sauvegarde. */ UPROPERTY(Transient) FName LastMenuCameraName = NAME_None; };