// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "InteractionPromptWidget.generated.h" class UInteractionComponent; class UTextBlock; /** * Affiche "Appuyez sur E pour Ramasser Objet" quand le joueur vise quelque * chose d'interactif, et se cache sinon. * * La classe est Abstract : on ne l'instancie jamais directement, on cree un * Widget Blueprint (WBP_InteractionPrompt) qui en herite. Le C++ porte la * logique, le Blueprint porte la mise en page. C'est la separation standard * en UMG, l'equivalent d'un prefab d'UI avec son script en Unity. * * Le widget ne fait AUCUN travail par frame : il s'abonne au delegue * OnPromptChanged du composant d'interaction et ne se met a jour que lorsque * le texte change reellement. * * OnPromptChanged et pas OnFocusChanged : le texte peut bouger sans que la * cible change -- un feu de camp qui egrene son compte a rebours, ou le regard * qui glisse d'un emplacement du grill a l'autre sur le meme acteur. */ UCLASS(Abstract) class EMBERWILD_API UInteractionPromptWidget : public UUserWidget { GENERATED_BODY() public: virtual void NativeConstruct() override; virtual void NativeDestruct() override; /** (Re)branche sur le composant d'interaction du pawn possede. */ void BindToOwningPawn(); protected: /** * meta = (BindWidget) : Unreal relie automatiquement ce pointeur au widget * nomme exactement "PromptText" dans le Widget Blueprint enfant. Si tu * oublies de le creer ou que tu le renommes, le Blueprint refuse de * compiler avec un message clair -- pas de crash silencieux au runtime. */ UPROPERTY(meta = (BindWidget)) TObjectPtr PromptText; /** * Texte affiche. {0} sera remplace par la touche, {1} par l'action. * Editable dans le Widget Blueprint pour ajuster la formulation. */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Interaction") FText PromptFormat; UInteractionPromptWidget(const FObjectInitializer& ObjectInitializer); private: /** Appele par le composant d'interaction a chaque changement du texte affiche. */ UFUNCTION() void HandlePromptChanged(const FText& NewPrompt); /** Recalcule le texte et la visibilite. */ void Refresh(); /** Nom lisible de la touche actuellement mappee sur l'action Interagir. */ FText GetInteractKeyDisplayName() const; /** Le composant auquel on est abonne, pour pouvoir se desabonner proprement. */ TWeakObjectPtr BoundComponent; };