Objectif
Permet au joueur d'effrayer des NPC présents dans une zone déterminée en maintenant une touche d’action. Une fois le temps de charge complété, les NPC fuient dans une direction opposée au personnage ou dans une zone sécurisée.
Fonctionnement général
- Le joueur maintient une touche (IA_Scare) lorsqu’il est dans une zone où des NPC sont présents.
- Un widget de chargement (barre de pourcentage) s’affiche à l’écran.
- Si la touche est relâchée trop tôt, l’action est annulée.
- Si le chargement est complété, un ScatterEvent est lancé.
- Tous les NPC présents dans la zone reçoivent l’événement NPC_Afraid, déclenchant leur fuite dans une direction opposée au joueur.Détail du pipeline (Barre de progression)
[Étape 0] Création d'un widget de type barre de progression circulaire
- Progression de 0% à 100%
- Texte indiquant "Spook" ou "Peur"
[Étape 1] Maintien de la touche
- IA_Scare est pressé.
- Un Branch vérifie si la variable NPCInReach est vraie (au moins un NPC dans la zone).
- Si oui, on active ScaringInUI (booléen d'état).
- Un widget Hold_FX_WB est créé et ajouté au viewport.
[Étape 2] Chargement du pourcentage
- Une Timeline appelée percentageUpdate augmente la valeur du pourcentage visuellement.
- Si la touche est relâchée avant la fin → le montage est stoppé et le widget est retiré.
[Étape 3] Validation de l’effroi
- Si la Timeline est complétée, une animation de scare est jouée (Play Montage).
- Variable ScaringInUI est désactivée.
- Variable ProjectCanScare est mise à true.
[Étape 4] Déclenchement de la fuite
- Un Branch vérifie si ProjectCanScare == true.
- Appel de ScatterEvent.Détail du pipeline NPC – Réaction à la peur
[Étape 1] Détection dans la zone
- Un trigger OnComponentBeginOverlap ajoute les NPC présents dans un array (NPCInZone).
- Un deuxième array gère les Polina (joueur).
- Si au moins un Polina ET un NPC sont présents → NPCInReach = true.
[Étape 2] Événement ScatterEvent
- Parcourt tous les NPC dans la zone (NPCInZone).
- Envoie à chacun l'événement NPC_Afraid.
[Étape 3] Réaction des NPC
- Chaque NPC (BP_GhoulieCharacter) utilise son node AI MoveTo.
- Calcule la direction opposée au joueur :
- Player Location – NPC Location → normalisation.
- Ce vecteur est multiplié par une distance de fuite (7000) et ajouté à la position du NPC.
- Un Delay court précède le déplacement.
- Utilise Get Random Reachable Point in Radius pour éviter un mouvement trop linéaire.
Problèmes rencontrés
- Difficulté à détecter précisément les NPC dans une zone partagée.
- Bugs liés au relâchement de la touche trop rapide (le widget restait à l’écran).
- Risque de lancement du ScatterEvent sans NPC présents.- NavMesh gardant en mémoire l'emplacement initial des NPC ce qui causait des obstacles invisible lors du scatter event.
Solution implémentée
- Utilisation d’un système de double-array (NPCInZone et PolinaInZone) pour valider la condition.
- Vérification constante du maintien de la touche via Timeline.
- Nettoyage des widgets UI et des flags booléens si l’action est interrompue.
- Delay de 0.2s entre les appels AI MoveTo pour éviter des conflits.- Update dynamique du NavMesh lorsque les NPC s'enfuient
Tests et validation
- Tests dans différentes configurations de zone (1 ou plusieurs NPC, entrée/sortie rapide).
- Utilisation de Print String sur : ScatterEvent, Entrée/sortie de zone, NPC_Afraid, Debug du déplacement des NPC en visualisant le point de destination.
Visuels
Colle ici des captures d’écran :
Blueprint
Résultat dans le viewport
Console debug si pertinent
Notes personnelles ou améliorations futures
- Ajouter une variation dans les réactions des NPC (certains pourraient hésiter ou tomber au sol).
- Ajouter un feedback sonore ou visuel pour souligner l’effet de panique.
- Ajouter un cooldown pour empêcher un spam de scare dans la même zone.