Objectif
Permet au personnage de ramasser dynamiquement un objet (le "Brain") au sol, en ajustant automatiquement la main gauche du personnage pour viser l'objet le plus proche. Cette interaction est jouée via un AnimMontage et adaptée même si plusieurs objets similaires sont présents dans la scène.
 Fonctionnement général

- Le joueur appuie sur le bouton d’interaction IA_Pickup.

- Si le personnage ne tient pas déjà un objet (HoldingBrain == false), il cherche automatiquement le Brain le plus proche dans la scène.

- Le système vérifie la distance entre la main et le Brain le plus proche.

- Si l’objet est suffisamment proche, il est attaché au socket "Object_Socket", désactivé en physique et collision, et le montage d’animation de ramassage est joué.

- En parallèle, la main se dirige automatiquement vers l’objet via une interpolation et un système IK.

- Une fois ramassé, l’objet est caché ou détruit, et le score est incrémenté.
Détail du pipeline (étape par étape)

[Étape 1] Déclenchement de l'action
- IA_Pickup (Input Action) est pressé.

- Un branch vérifie que HoldingBrain est false.

[Étape 2] Détection de l’objet le plus proche
- UpdateClosestBrain : cherche tous les acteurs de type BP_Brain dans la scène.

- Mesure la distance de chacun à la main via Get Socket Location + Distance (Vector).

- Le plus proche (si < 1000 unités) est sélectionné comme BrainLocation.

[Étape 3] Micro-ajustement visuel de la main
- Dans l’AnimGraph, la position du bone de la main gauche (index_metacarpal_J) est interpolée vers la position de l’objet le plus proche avec un VInterpTo.

- Cette interpolation est injectée dans le système Two Bone IK.

[Étape 4] Animation et interaction
- L’objet est détaché s’il était attaché à un autre composant.

- L’animation de ramassage est jouée via Play Montage.

- Physique et collisions sont désactivées sur l’objet.

- L’objet est attaché au socket Object_Socket.

[Étape 5] Post-interaction
- Un delay attend la fin de l’animation.

- HoldingBrain est mis à true.

- Le score est incrémenté.

- Optionnel : l’objet est détruit ou rendu invisible.
Problèmes rencontrés
- Difficulté à faire en sorte que l’objet ciblé soit toujours le bon dans une scène contenant plusieurs objets du même type.

- Problèmes de rotation étrange de la main si l’objet était trop loin ou trop proche.

- Mauvaise mise à jour de la variable ClosestObject dans certains cas.
Solution implémentée
- Ajout d’un clamp de distance pour éviter les glitches d’interpolation.

- Vérification explicite de validité avec IsValid avant d’assigner le Brain sélectionné.

- Forçage d’une position d’accroche standard via Attach Component to Component pour une position cohérente sur tous les objets.
Tests et validation

- Utilisation de Print String pour vérifier :

- Quelle instance de Brain est sélectionnée : Si la distance est correcte (<1000), Si la variable HoldingBrain est bien mise à jour, Test avec plusieurs objets dans la scène à différentes distances et orientations, Vérification visuelle dans le viewport que la main suit bien la position du Brain.
 Visuels
Colle ici des captures d’écran :
Blueprint

- Résultat dans le viewport

- Console debug si pertinent
Notes personnelles ou améliorations futures

- Ajouter un effet sonore ou feedback visuel (halo, surbrillance) lorsque l’objet est détecté comme ramassable.
- Pouvoir relâcher l'objet ou le ranger dans un inventaire.
Back to Top