ed7c7fd991
Boucle de jeu complète : récolte, inventaire, consommation, stats de survie, mort et respawn. Gameplay en C++, Blueprints réservés au câblage d'assets. Assets binaires (.uasset, .umap, textures, audio) suivis via Git LFS. Binaries/, Intermediate/, Saved/ et DerivedDataCache/ sont ignorés : régénérés au build, ils pèsent 3 Go pour 1,3 Go de contenu utile. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
72 lines
2.7 KiB
C++
72 lines
2.7 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "UObject/Interface.h"
|
|
#include "Interactable.generated.h"
|
|
|
|
/**
|
|
* Classe technique requise par Unreal. On ne la manipule jamais directement,
|
|
* elle sert uniquement au systeme de reflection : c'est elle qu'on passe a
|
|
* Implements<UInteractable>() et a Execute_XXX().
|
|
*/
|
|
UINTERFACE(MinimalAPI, BlueprintType)
|
|
class UInteractable : public UInterface
|
|
{
|
|
GENERATED_BODY()
|
|
};
|
|
|
|
/**
|
|
* A implementer par tout ce avec quoi le joueur peut interagir : objets a
|
|
* ramasser, portes, coffres, etablis, plantes a recolter.
|
|
*
|
|
* Les fonctions sont des BlueprintNativeEvent : une classe C++ surcharge
|
|
* XXX_Implementation(), un Blueprint surcharge l'evenement du meme nom.
|
|
* Les deux fonctionnent, et l'appelant n'a pas a savoir lequel des deux
|
|
* il a en face -- c'est tout l'interet de passer par une interface.
|
|
*
|
|
* IMPORTANT : pour appeler ces fonctions depuis l'exterieur, utilise
|
|
* IInteractable::Execute_Interact(Actor, Interactor) et jamais
|
|
* Actor->Interact() directement. Seul le wrapper Execute_ sait router
|
|
* l'appel vers une implementation Blueprint.
|
|
*/
|
|
class SURVIVAL_PROJET_API IInteractable
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
/**
|
|
* Texte affiche au joueur quand il vise l'objet ("Ramasser", "Ouvrir"...).
|
|
* Renvoie du FText et non du FString : c'est le type localisable d'Unreal,
|
|
* indispensable si tu traduis le jeu un jour.
|
|
*/
|
|
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Interaction")
|
|
FText GetInteractionPrompt() const;
|
|
virtual FText GetInteractionPrompt_Implementation() const { return FText::GetEmpty(); }
|
|
|
|
/**
|
|
* Permet de refuser l'interaction selon le contexte : porte verrouillee,
|
|
* inventaire plein, competence manquante. Renvoyer false empeche l'objet
|
|
* d'etre meme selectionne par le composant d'interaction.
|
|
*/
|
|
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Interaction")
|
|
bool CanInteract(AActor* Interactor) const;
|
|
virtual bool CanInteract_Implementation(AActor* Interactor) const { return true; }
|
|
|
|
/** L'interaction elle-meme. Interactor est le pawn du joueur. */
|
|
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Interaction")
|
|
void Interact(AActor* Interactor);
|
|
virtual void Interact_Implementation(AActor* Interactor) {}
|
|
|
|
/** Le joueur commence a viser l'objet : surbrillance, son, animation. */
|
|
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Interaction")
|
|
void OnBeginFocus();
|
|
virtual void OnBeginFocus_Implementation() {}
|
|
|
|
/** Le joueur ne vise plus l'objet. */
|
|
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Interaction")
|
|
void OnEndFocus();
|
|
virtual void OnEndFocus_Implementation() {}
|
|
};
|