Rangement de Content : maps de test dans Maps/DevTest, packs dans Assets/

- Toutes les maps de test regroupées dans Content/Maps/DevTest (+ HLOD/).
- Animations et Kimodo -> Content/Assets/Animations ; Prop, PropsParis,
  RueDeParis et Bridges -> Content/Assets/Environment ; MetaHuman "test"
  -> Characters/MEtahuman/Unpacked/test.
- KitFR et ProjectF restent à la racine (trop lourds pour l'éditeur).
- Suppression des assets AST inutilisés du StateManager, des maps de démo
  tierces, des restes de test et de ~280 redirecteurs.
- CoreRedirect /Game/Bridges/ pour les fichiers de Bridges déplacés sur disque.
- Notifies AST ReloadNotify/SetEquippedWeapon vidés (appelaient l'inventaire AST).
- Architecture_Projet.md à jour (§7, §8, §9, journal).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
DodoandClaude Opus 5.5 committed 2026-10-30 20:34:21 +01:00
1 parent e829ff2808
commit d19df0a428
791 files changed
+1248 -1232

No files matched your search

+63 -27
View File
@@ -30,7 +30,7 @@ Le projet est construit par empilement de **trois grands blocs** de contenu, plu
4. **Outillage IA** — plugins `VibeUE`, `EditorToolset`, `ModelContextProtocol`, `Terminal` (déclarés dans `ProjectFv1.uproject`) + `.mcp.json` à la racine. Ils exposent l'éditeur Unreal (Blueprints, Widgets, Input, PCG, Landscape, Niagara, etc.) à un serveur MCP local (`http://127.0.0.1:8000/mcp`) piloté par des agents Claude. **C'est le mécanisme par lequel un modèle d'IA lit/modifie ce projet** — voir la section [9. Notes pour les IA](#9-notes-pour-les-ia-pièges-connus-de-loutillage) pour les pièges connus.
En plus de cela, deux couches d'assets tiers volumineuses sont présentes mais **ne contiennent pas de logique de gameplay propre au projet** : le pack météo **UltraDynamicSky** (`Content/Systems/Weather/UltraDynamicSky/`) et diverses bibliothèques d'assets 3D Fab/Megascans/Quixel (`Content/Fab/`, `Content/Megaplant_Library/`, une bonne partie de `Content/Animations/` et `Content/Characters/`).
En plus de cela, deux couches d'assets tiers volumineuses sont présentes mais **ne contiennent pas de logique de gameplay propre au projet** : le pack météo **UltraDynamicSky** (`Content/Systems/Weather/UltraDynamicSky/`) et diverses bibliothèques d'assets 3D Fab/Megascans/Quixel (`Content/Fab/`, `Content/Megaplant_Library/`, une bonne partie de `Content/Assets/Animations/` et `Content/Characters/`).
### 1.3 Dépendances principales entre systèmes
@@ -104,7 +104,7 @@ Character (Pawn, géré par le framework "Sandbox Character")
│ `Get_MMInterruptMode` (3ᵉ pin ajoutée au nœud `ORBoolean` existant via `add_node_pin`, PAS une réécriture
│ DSL complète — voir §9 pour le piège du wildcard enum). (2) Une fois l'interruption forcée, la recherche
│ échouait quand même : `PSD_Dense_Stand_Bow_Idles`/`_Bow_Aim_Idles`/`PSD_Walk_Bow`/`PSD_Crouch_Bow`
│ (toutes sous `/Game/Animations/humain/Armed_mov/Bow/`) avaient leur `PoseSearchMode` sur `PCAKD_TREE`
│ (toutes sous `/Game/Assets/Animations/humain/Armed_mov/Bow/`) avaient leur `PoseSearchMode` sur `PCAKD_TREE`
│ et leur build d'index échouait dès le chargement (`LogPoseSearch: Error: ... BuildIndex Failed because
│ of 'No Convergence' while calculating PCA data`) — passées en `BRUTE_FORCE` (pas besoin de PCA, dataset
│ de toute façon minuscule), ce qui a débloqué la recherche. (3) **Lignes armées manquantes dans le
@@ -205,6 +205,7 @@ Le suffixe `AGIS` sur beaucoup d'assets (`IA_InteractAGIS`, `WB_...AGIS`, foncti
- **Nouvel objet d'inventaire (item)** → suivre le patron existant dans `Content/Items/` : un Blueprint `BP_Item_<Nom>` (héritant de `_BP_ItemBase` ou d'une base spécialisée dans `Items/BaseBlueprints/`), ses assets (mesh/matériau/texture) dans un sous-dossier `Content/Items/<Nom>/` ou `Content/Items/Resources/<Nom>/`, et une entrée dans `DT_Items` / les DataAssets sous `Content/Data/Inventory_Data/DataAssets/`.
- **Nouvel Input Action lié à l'inventaire** → `Content/Systems/Inventory/Other/Inputs/Actions/`, mappé dans `IMC_AGIS_Character` ou `IMC_AGIS_InventoryTab`. **Input Action de déplacement/caméra générique** → `Content/Core/PlayerController/Input/`, mappé dans `IMC_Sandbox`.
- **Nouveau widget d'inventaire** → `Content/UI/Inventory_UI/Widgets/`. **Nouveau widget hors inventaire** (HUD, menus) → `Content/UI/Widgets/`.
- **Nouvelle map de test** → `Content/Maps/DevTest/` (jamais dans le dossier du système testé). **Nouveau pack d'art du projet** (import Blender) → `Content/Assets/Environment/<Pack>/` ; **animations** → `Content/Assets/Animations/` (voir §8).
- Le clavier cible est **AZERTY** ; privilégier des touches identiques physiquement sur QWERTY/AZERTY pour les nouveaux raccourcis (ex. `V`, `B`).
- Réplication réseau : toute action qui modifie l'état du jeu côté inventaire/stats doit suivre le patron `Request X SERVER` (Custom Event `...SERVER`, `Replicated From Client, Executes On Server`) déjà présent dans `Inventory_Player`.
@@ -472,7 +473,7 @@ Le pipeline existait déjà dans le projet mais était **incomplet** : `SandboxC
Assets créés / restaurés, tous dans `Content/Systems/Mover/VisualOverrides/` :
- **`ABP_GenericRetarget`** — récupéré du commit initial (`538ebd2a`). C'est un **Animation Blueprint Template** (`bIsTemplate`, donc sans squelette cible : utilisable sur n'importe quel mesh). Son AnimGraph tient un seul nœud `Retarget Pose From Mesh` ; son `EventBlueprintUpdateAnimation` choisit l'`IKRetargeter` dans la map `IKRetargeter_Map` **en utilisant le premier Component Tag du composant qui l'héberge** comme clé. La map garde ses entrées d'origine (toutes à `None`, les retargeters du sample ayant été supprimés) plus la nôtre.
- **`IK_MetaHuman_test`** — IK Rig sur `/Game/test/Body/SKM_test_BodyMesh`, généré par `IKRigController.apply_auto_generated_retarget_definition()` (l'auto-caractérisation reconnaît le squelette MetaHuman : bassin = `pelvis`, 29 chaînes standard).
- **`IK_MetaHuman_test`** — IK Rig sur `/Game/Characters/MEtahuman/Unpacked/test/Body/SKM_test_BodyMesh`, généré par `IKRigController.apply_auto_generated_retarget_definition()` (l'auto-caractérisation reconnaît le squelette MetaHuman : bassin = `pelvis`, 29 chaînes standard).
- **`RTG_UEFN_to_MetaHuman_test`** — source `IK_UEFN_Mannequin`, cible `IK_MetaHuman_test`. `auto_map_chains(EXACT)` mappe tout sauf deux chaînes, l'auto-caractérisation MetaHuman nommant `LeftFoot`/`RightFoot` ce que le mannequin appelle `LeftToe`/`RightToe` — mappées à la main.
⚠️ **`add_default_ops()` ne crée PAS l'op des chaînes IK.** La pile par défaut est Pelvis Motion / FK Chains / Run IK Rig / Root Motion / Remap Curves ; or `ABP_GenericRetarget::UpdateRetargetProfile` va chercher l'op **nommée « Retarget IK Goals »** (`GetOpControllerFromRetargetProfile` → cast vers `IKRetarget_IKChains_Controller`) pour moduler l'alpha d'IK par chaîne. Sans elle, le cast renvoie None et `SetSettings` spamme un *Blueprint Runtime Error* à chaque frame. Correctif : `add_retarget_op("/Script/IKRig.IKRetargetIKChainsOp")` — le **chemin de classe complet est obligatoire**, le nom court est refusé (retourne -1). L'op arrive déjà nommée « Retarget IK Goals » et se place juste avant « Run IK Rig » ; il faut ensuite refaire `assign_ik_rig_to_all_ops` + `auto_map_chains` (les mappings de chaînes sont **par op**). Résultat : 4 chaînes IK (LeftLeg, LeftArm, RightLeg, RightArm), plus aucune erreur en PIE.
- **`BP_VisualOverride_MetaHuman`** — Actor : `Body` (racine, `SKM_test_BodyMesh`, `AnimClass = ABP_GenericRetarget_C`, **Component Tag `RTG_UEFN_to_MetaHuman_test`**) → `Face` (`SKM_test_FaceMesh`, `ABP_Face_C`) ; plus un `MetaHumanComponentUE` (`BodyComponentName = "Body"`, `FaceComponentName = "Face"`, post-process `ABP_Clothing_PostProcess`). Pas de grooms : ce MetaHuman n'en a aucun d'assigné.
@@ -508,7 +509,7 @@ Source : projet frère `E:\AST_V1_17\AST_V1_17` (framework GASP + plugins `AST_*
- **ABP `Systems/Mover/SandboxCharacter_Mover_ABP`** : `Slot DefaultSlot → OverlayGraph (Linked Anim Graph, tag Overlay) → Dead Blending` et `Procedural_FullBody → InteractionIKGraph → Pose History`. `Get/Set_InteractionTransform` existaient déjà (GASP 5.8).
- **`OverlayGraph::CanDynamicTransition` renvoie toujours false** : les transitions ALS (petits pas « Grounded Slot ») étaient jouées en montage dynamique et, le slot `Grounded Slot` étant dans `DefaultGroup` du squelette `SK_UEFN_Mannequin` chez nous (groupe à part `GroundedGroup` chez AST), elles interrompaient au bout de 4 frames les montages de couverture/interaction/traversée. Pour les réactiver proprement : dans le squelette → Anim Slot Manager, créer `GroundedGroup` et y déplacer `Grounded Slot` (AST range aussi `HitReactionSlot` dans `HitGroup` et Fire/Legs/Arm R/Curves/Spine/Head/Arm L/Pelvis dans `Layer`) — non scriptable (SlotGroups non exposé à Python).
- `BPC_Interaction::Release PullPush Object` remet l'overlay sur **None** (AST : Default) pour retrouver l'état de départ du perso.
- Vérifié en PIE (`Test/L_ASTCoverTest`) : couverture basse et haute (entrée par montage motion-matché, glissement, demi-tour, sortie en reculant), porte, porte électronique, placard, levier, pousser/tirer. `MapDev1` : aucune erreur runtime liée à AST.
- Vérifié en PIE (`Maps/DevTest/L_ASTCoverTest`) : couverture basse et haute (entrée par montage motion-matché, glissement, demi-tour, sortie en reculant), porte, porte électronique, placard, levier, pousser/tirer. `MapDev1` : aucune erreur runtime liée à AST.
- **Restes connus** : l'objet poussé passe 0,2 s en physique au relâchement et peut glisser ; `BP_MovementMode_WalkingAST` (décélération instantanée en couverture) est porté mais non utilisé ; les os virtuels d'arme AST (`VB RHS_WeaponTrace`…) manquent au squelette (avertissements de compilation d'`OverlayGraph`, sans effet hors armes AST) ; la visée depuis la couverture (`UpdateCoverAim`) n'a pas été testée.
### 4.3 Autres systèmes de gameplay (ajouts spécifiques au projet)
@@ -537,7 +538,7 @@ Content/Systems/
│ └── STT_MoveAwayFromThreat.uasset → Utilisé par `Flee`. À l'entrée : diffuse l'alerte à la horde puis `IssueFleeMove` : point à 1500 dans la direction opposée à `GetThreatLocation` (XY), projeté sur le NavMesh (extent 300/300/1000), sinon point atteignable aléatoire dans 1500 autour de l'animal. Ré-émis tant que l'état Flee est actif dès que l'animal arrive (≤200) ou est bloqué (vitesse < 20 après 1s) — c'est la transition du StateTree qui termine la fuite. `ExitState` arrête le mouvement.
│
│ Espèces (enfants de BP_AnimalBase, aucun nouvel asset graphique créé — réutilisent les meshes/anims
│ déjà présents sous Content/Characters/Animal/DeerStagAndDoe/ et Content/Animations/DeerAndDoe/) :
│ déjà présents sous Content/Characters/Animal/DeerStagAndDoe/ et Content/Assets/Animations/DeerAndDoe/) :
│ ├── BP_Deer_Stag.uasset → SK_DeerStag + jeu d'anims ANIM_DeerStag_* (RestEnter/Exit = GoToRest/RestToGoBackUp), HerdID "DeerHerd_A".
│ └── BP_Deer_Doe.uasset → SK_DeerDoe + jeu d'anims ANIM_DeerDoe_* (`Anim_Rest`=IdleRest, manquante avant le 2026-09-14), HerdID "DeerHerd_A" (même horde que le cerf → réactivité croisée via BroadcastAlertToHerd/ReceiveHerdAlert).
│
@@ -562,14 +563,14 @@ Content/Systems/
│ │ ├── Actors/DoorActor, ElectronicDoorActor, CupboardActor, LeverActor, PullPushObject → Interactifs à poser dans les maps (leurs points d'interaction sont des ChildActor `BP_Door`/`BP_Cupboard`… de ASTShared/Inventory).
│ │ ├── Blueprints/Enums, Interfaces, Structs, Data/CHT_MovetoInteraction ; Character/AnimationNotify (InteractionEvent, ANS_TrackInteractionIKLocation, AN_GrabPullPushObje)
│ │ └── Character/Animations/ (Door, Cupboard, Lever, ElectronicDoor, MoveTo), Props/ (maillages porte/placard/levier)
│ ├── StateManager/ → Copie INTÉGRALE du plugin AST_StateManager (~565 assets) ; seule une partie sert (≈190 assets, §4.2.5). Le reste (cartes, caméras, poses d'armes, loot…) est candidat au nettoyage.
│ ├── StateManager/ → Copie du plugin AST_StateManager, **réduite le 2026-10-30 aux ~220 assets réellement utilisés** (249 assets non référencés supprimés : caméras AST, poses/anims d'armes et de mêlée, loot, `AST_GameInstance`, maps de démo `ShowcaseMap`/`DefaultLevel1`). Gardés malgré l'absence de référence : les 2 tables de tags (déclarées en config) et `Maps/LevelPrototyping/Meshes/SM_Cube` (cible d'un `[CoreRedirects]`). Les notifies `ReloadNotify` et `SetEquippedWeapon` (utilisés par les montages d'armes AST) appelaient l'inventaire AST non porté : leur graphe est vidé (ne font rien), sinon ils ne compilaient pas.
│ │ ├── Blueprints/ActorComponent/StateActorComponent + BPC_StateManager → Hub d'états AST (CoverState, InteractionState, OverlayState, entrées, ClosestActor…), cherché par les autres composants via GetComponentByClass/tags.
│ │ ├── Character/Animations/AnimationLayers/OverlayGraph (+ OverrideOverlayLayer) → calque lié (tag `Overlay`) : poses de couverture/pousser-tirer. `CanDynamicTransition` forcé à false (transitions ALS désactivées, §4.2.5).
│ │ ├── Character/Animations/AnimGraphs/InteractionIKGraph → calque lié : IK des mains pendant les interactions.
│ │ ├── Blueprints/Data/AST_GameplayTagDT, AST_StateTreeGameplayTagDT → tables de tags `AST.*` (déclarées dans DefaultGameplayTags.ini).
│ │ ├── Blueprints/Data/AST_GameplayTagDT → table de tags `AST.*` (déclarée dans DefaultGameplayTags.ini ; `AST_StateTreeGameplayTagDT` n'était qu'un redirecteur vers elle, supprimé avec sa ligne de config le 2026-10-30).
│ │ └── Inputs/IA_TakeCover (+ IMC_AST non utilisé)
│ ├── ASTShared/ → Sous-ensemble minimal (~44 assets) des plugins AST non portés, pour que StateManager/Interaction se chargent sans références cassées : Inventory/ (E_ItemType, BPI_ItemBase, BPI_InventorySystem, BP_InteractionActorBase + BP_Door/BP_ElectronicDoor/BP_Cupboard/BP_Lever/BP_PullpushObject, InteractionWidget), Melee/, NPC/ (BPI_AIController, EnemyDetectBS…), Parkour/ (interfaces, ParkourActor). Aucune logique de ces systèmes n'est active.
│ └── Test/L_ASTCoverTest.umap → Map de test : murs bas/haut + CoverWallActor, porte, porte électronique, placard, levier, objet à pousser ; GameMode GM_Dev.
│ └── (Test/L_ASTCoverTest.umap déplacée dans `Content/Maps/DevTest/` le 2026-10-30, voir §7)
│
├── Scent/BP_ScentPoint.uasset → Point émetteur d'odeur, spawné par `SandboxCharacter_CMC::ScentFunct` (toutes les 2s pendant que le joueur se déplace) et consommé par `AC_AnimalSenses::CheckScent` (Systems/Wildlife/, §4.4). (2026-09-05) Deux bugs corrigés à la réutilisation par la faune : (a) `ScentFunct` ne créait le point QUE via `SpawnActorFromClass`, sans jamais appeler son événement `Custom|Create(life)` — la durée de vie (`TimeToLife`) restait donc à 0 ; ajout d'un appel explicite `Create(life=20.0)` juste après le spawn. (b) Le décompte de durée de vie (`Custom|CustomEvent(DeltaTime)`) existait déjà mais n'était appelé par PERSONNE (`BeginPlay` enregistrait l'acteur auprès de `BP_TickManager` mais rien n'invoquait réellement l'event) — le point ne s'auto-détruisait donc jamais ; ajout d'un `EventTick` natif qui appelle directement ce Custom Event (évite de toucher au brancher `BP_TickManager` partagé, hors-scope). Comparaison de fin de vie durcie de `== 0` à `<= 0` (float exact-equality fragile). Aucune nouvelle logique d'odeur créée — uniquement réparation du mécanisme existant.
├── Movable_Object/BP_Moveble_Object.uasset → Objet physique déplaçable par le joueur
@@ -661,7 +662,7 @@ Content/UI/
---
## 7. `Content/Items/`, `Content/PCG/`, `Content/Maps/`, `Content/VFX/`, `Content/Prop/`
## 7. `Content/Items/`, `Content/PCG/`, `Content/Maps/`, `Content/VFX/`
```text
Content/Items/ → Objets ramassables/équipables du jeu
@@ -677,7 +678,7 @@ Content/Items/ → Objets ramassables/équipables du
│
│ **Gameplay de l'arc** (`BP_Item_Bow`, 2026-09-05/06) — override des hooks existants `Custom|PrimaryUse`/`StopPrimaryUsing` de `_BP_ItemBase`, sans nouveau système d'input : `PrimaryUse` vérifie `AC_Weapon->CanUse()` ET `CountArrows() >= 1` (fonction propre, voir §1.3 pour `Owner Inventory`) avant de démarrer la tension (horodatage `DrawStartTime`, pas de Timeline), puis joue `Draw Montage` (`AM_Bow_Draw`, voir ci-dessous) sur le mesh du personnage. `StopPrimaryUsing` calcule la puissance (`Clamp((Now-DrawStartTime)/MaxDrawTime, MinDrawPower, 1.0)`), joue `Fire Montage` (`AM_Bow_Fire`), appelle `ConsumeArrow()` et, si réussi, spawn `BP_Projectile_Arrow` au socket `ArrowSocket` avec vitesse/dégâts scalés par la puissance, puis appelle `AC_Weapon->TryUsePrimary()`.
│ **`ConsumeArrow()` — fix du 2026-09-06** : retrouve le stack "Arrow" via `BOTH|FindItem`, puis réduit son montant via `Inventory__Main::AddItemAmount(ItemAddress, -1)` — une opération purement sur les DONNÉES de l'inventaire, par adresse, ne nécessitant aucun acteur monde. L'implémentation d'origine appelait `Utilities|GetItemActor` (macro `ML_InventoryMacros::Get Item Actor`) puis `SERVER|ReduceAmount` sur cet acteur — ce qui échoue TOUJOURS silencieusement pour un item empilé passif comme "Arrow" qui, tant qu'il n'est pas équipé/lâché dans le monde, n'a jamais d'acteur spawné (`GetItemActor` retourne systématiquement invalide). Symptôme observé : le tir semblait démarrer (logs "TIR EN COURS") mais aucune flèche ne partait et aucune munition n'était consommée. Voir aussi §9 pour la même leçon appliquée à toute consommation de stock passif (ne jamais utiliser `GetItemActor`+fonction-sur-acteur pour un item qui n'est pas garanti d'être spawné dans le monde — utiliser `Inventory__Main::AddItemAmount` par adresse à la place).
│ **Animations de l'arc** (2026-09-06) — `AM_Bow_Draw`/`AM_Bow_Fire.uasset` (`Content/Items/`) sont des `AnimMontage` à piste unique générés depuis `standingdrawarrow_UE`/`standingaimrecoil_UE` (`Content/Animations/humain/Armed_mov/Bow/`), assignés au **slot `UpperBody`** (voir `SandboxCharacter_CMC_ABP` ci-dessous — PAS `DefaultSlot`). Variables `Draw Montage`/`Fire Montage` sur `BP_Item_Bow`, jouées via un nœud natif `Animation|Montage|PlayMontage` sur le mesh du personnage (`Cast Owner Character → Character → GetMesh`). Appel direct (pas de variante Multicast `...CLIENTS` comme pour `PlayReloadMontageCLIENTS` du fusil) — suffisant en PIE solo ; à revoir si une réplication multijoueur de l'anim est nécessaire plus tard.
│ **Animations de l'arc** (2026-09-06) — `AM_Bow_Draw`/`AM_Bow_Fire.uasset` (`Content/Items/`) sont des `AnimMontage` à piste unique générés depuis `standingdrawarrow_UE`/`standingaimrecoil_UE` (`Content/Assets/Animations/humain/Armed_mov/Bow/`), assignés au **slot `UpperBody`** (voir `SandboxCharacter_CMC_ABP` ci-dessous — PAS `DefaultSlot`). Variables `Draw Montage`/`Fire Montage` sur `BP_Item_Bow`, jouées via un nœud natif `Animation|Montage|PlayMontage` sur le mesh du personnage (`Cast Owner Character → Character → GetMesh`). Appel direct (pas de variante Multicast `...CLIENTS` comme pour `PlayReloadMontageCLIENTS` du fusil) — suffisant en PIE solo ; à revoir si une réplication multijoueur de l'anim est nécessaire plus tard.
│ **Intégration à la locomotion (2026-09-06)** — un montage plein-corps sur `DefaultSlot` remplaçait TOUT le squelette (jambes comprises) par la pose figée de l'animation source, ce qui semblait correct à l'arrêt (la pose "debout" du montage coïncide avec Motion Matching à l'arrêt) mais cassait la marche/course/crouch (jambes figées dans la pose d'arc "debout" enregistrée). Fix : ajout d'un **`Slot 'UpperBody'`** + nœud **`Layered Blend Per Bone`** dans l'`AnimGraph` de `SandboxCharacter_CMC_ABP`, avec un filtre de branche sur l'os `spine_01` (BlendDepth=-1 → toute la branche colonne+bras+tête, jambes/bassin exclus) — voir §9 pour le détail technique (le skeleton `SK_UEFN_Mannequin` avait déjà un Blend Profile "UpperBody" masquant exactement les mêmes os, confirmant que `spine_01` est le bon point de coupure, mais ce Blend Profile n'est pas directement utilisable par ce nœud en 5.8 — filtre de branche manuel utilisé à la place). Le `DefaultSlot` existant (plein corps) n'est pas touché, réutilisable tel quel pour de futures actions plein-corps. Motion Matching, Pose Search, Aim Offset (`Enable_AO`/`Get_AOValue`), Foot/Leg IK et Orientation Warping — tous déjà présents dans cet AnimBP — continuent de piloter le bas du corps et la visée sans changement.
├── BP_Item_SurvivorOutfit_Top / _Pants / _Boots.uasset → (2026-09-21) Les 3 pièces de la tenue MetaHuman « SurvivorOutfit », enfants de `BP_Item_OutfitPiece_Base`. Lignes DT_Items `SurvivorOutfit_Top` (`Human.Body` → EquipSlotBODY, partagé avec BodyArmor), `SurvivorOutfit_Pants` (`Human.Pant` → EquipSlotPANTS), `SurvivorOutfit_Boots` (`Human.Shoes` → EquipSlotSHOES) ; icônes générées au runtime. Chaque enfant ne fixe que `VisibleMaterialSlots` (Top = MI_Survivor_Coat + MI_Survivor_Tshirt, Pants = MI_Survivor_Pant, Boots = MI_Survivor_Boot) et l'override du mesh au sol `ItemMesh_STATIC` (SM_SurvivorOutfit_Coat/Pant/Boot). `BP_Spawner5` de MapDev1 pointe sur `SurvivorOutfit_Top`.
├── Attachments/BP_Item_MagazineBase, BP_Item_RifleFlashlight, BP_Item_Suppressor.uasset → Attachements d'armes
@@ -714,7 +715,7 @@ Content/PCG/ → Génération procédurale de conte
│ │ DT_PF_HM_Tints, DT_PF_HM_Types (type de module par Kind×Role), DT_PF_HM_Variants (mesh/matériau pondérés
│ │ par TypeId×teinte×dégradation), DT_PF_HM_LeafSlots (charnières des battants), DT_PF_HM_Tiles.
│ │ Source CSV unique : `E:/projet/PF_Haussmann_Work/scripts/hm_data_csv.py` (+ `ue_hm_data.py` pour réimporter)
│ └── Maps/L_PF_HaussmannTest.umap → Niveau de test non partitionné : 8 variantes (H0 à H4, R+4 à R+7, FacadeLength, îlot fermé, immeuble d'angle)
│ └── (niveau de test : `Maps/DevTest/L_PF_HaussmannTest`)
├── RoadNetwork/ → (2026-10-28/29) Système PCG de routes et ponts post-apo (France 2127). Doc complète : `Docs/PCG_RoutesPonts.md`
│ ├── Blueprints/BP_PF_Road.uasset → Route : spline + `PCG_Structure` (PCG_PF_Road_Structure) + `PCG_Decoration` (PCG_PF_Road_Decoration). Variables
│ │ `Profile` (Name, ligne de DT_PF_RoadProfiles), `Degradation` (0..3), `bSnapToLandscape`. Graine = Seed du composant PCG
@@ -731,27 +732,36 @@ Content/PCG/ → Génération procédurale de conte
│ ├── Materials/ → M_PF_Road (couches par couleurs de sommets + marquages), M_PF_Structure (triplanaire), M_PF_Sign,
│ │ M_PF_DecalMesh (inutilisé : couche Decal désactivée) + Instances/MI_*
│ ├── Textures/ → T_PF_* (surfaces Fab/Megascans 2K, atlas de panneaux, masques de decals)
│ └── Maps/L_PF_RoadBridgeTest.umap → Niveau de test World Partition des 9 scénarios (terrain 1 km², rivière, ruisseau, vallée) + ses couches HLOD générées
│ └── (niveau de test : `Maps/DevTest/L_PF_RoadBridgeTest`)
├── Road/ → Prototype antérieur (une route, conservé tel quel, instance dans MapDev1). Remplacé par RoadNetwork/ pour les nouvelles routes
│ ├── PCG_Road.uasset → Graphe PCG générant la route procédurale (matériaux vieillis/mousse/humidité, potholes via GeometryScript)
│ ├── BP_AbandonedRoad.uasset → Acteur portant le graphe PCG
│ ├── M_Road.uasset, ST_Road_data.uasset, EM_Road_Type.uasset → Matériau, struct de données et enum de types de route
├── Vegetation/TreeTest.uasset → Graphe PCG de placement de végétation (arbres, générés via PVE pour la route)
└── test/NewPCGGraph1.uasset → Graphe de test/brouillon
└── Vegetation/TreeTest.uasset → Graphe PCG de placement de végétation (arbres, générés via PVE pour la route)
Content/Maps/DevMap/
├── MapDev1.umap → 🗺️ Map de développement PRINCIPALE (GameDefaultMap / EditorStartupMap, voir Config/DefaultEngine.ini)
├── GM_Dev.uasset → GameMode utilisé sur MapDev1 (hérite directement de GameModeBase, indépendant de GM_Sandbox/Gamemode_AGIS)
├── pcg_Test_Dev.umap → Map de test PCG
└── PCG_Test_Dev_HLODLayer_*, Untitled_HLOD0_Instancing.uasset → Assets HLOD générés pour les maps de test
Content/Maps/
├── DevMap/ → Map de développement principale et rien d'autre
│ ├── MapDev1.umap → 🗺️ Map de développement PRINCIPALE (GameDefaultMap / EditorStartupMap, voir Config/DefaultEngine.ini)
│ ├── GM_Dev.uasset → GameMode utilisé sur MapDev1 (enfant de GM_Sandbox, §4.2.4)
│ └── _GENERATED/ → Meshes fusionnés générés par l'éditeur, placés dans MapDev1
└── DevTest/ → (2026-10-30) TOUTES les maps de test, rangées à plat (règle : une nouvelle map de test va ici,
│ jamais dans le dossier du système testé)
├── L_ASTCoverTest.umap → Couverture + interactions AST (murs bas/haut + CoverWallActor, portes, placard, levier, caisse ; GM_Dev)
├── L_MoverTest.umap + GM_MoverTest → Ancien banc d'essai du personnage Mover (GameMode propre à cette map)
├── L_BridgeTest.umap, L_BridgeTest_Geo.umap → Kits de ponts (Assets/Environment/Bridges) ; _Geo charge les ponts entiers (très lourds en mémoire)
├── L_KitFR_Demo.umap → Présentation du kit KitFR
├── L_PF_Demo.umap → Présentation des assets ProjectF + variantes (acteurs tagués PF_VARIANTES)
├── L_RueDeParis.umap → Rue de test (RueDeParis + PropsParis + KitFR)
├── L_PF_HaussmannTest.umap → PCG Haussmann : 8 variantes (H0 à H4, R+4 à R+7, FacadeLength, îlot fermé, angle), non partitionnée
├── L_PF_RoadBridgeTest.umap → PCG routes et ponts : 9 scénarios, World Partition (terrain 1 km², rivière, ruisseau, vallée)
├── pcg_Test_Dev.umap → Ancienne map de test PCG (World Partition)
└── HLOD/ → Couches HLOD générées des deux maps World Partition
Content/VFX/
├── Firetrail/BP_FireTrail.uasset, Effects/P_BulletTrail.uasset, Materials/M_BulletTrail.uasset → Traînée de balle
└── MI_MuzzleFlash, M_MuzzleFlash, MuzzleFlash, P_MuzzleFlash → Effet de tir (bouche de canon)
├── M_Blood.uasset, T_Blood.uasset → Effet de sang
└── crosshair.uasset, hitmarker.uasset → Éléments de HUD de tir
Content/Prop/Wooden_Door/ → Prop de porte en bois (mesh + matériaux), utilisé par les BP de porte interactable
```
---
@@ -760,13 +770,24 @@ Content/Prop/Wooden_Door/ → Prop de porte en bois (mesh + mat
Ces dossiers contiennent des assets achetés/importés (Marketplace, Fab/Quixel Megascans, Megaplant, packs d'animation mocap). Ils sont volumineux (des centaines de fichiers) et **ne sont volontairement pas détaillés fichier par fichier** ici — voir §10 pour la règle sur quand les documenter.
**Règle de rangement (2026-10-30)** : les packs d'art faits pour le projet (générés dans Blender, importés par les scripts de `ProjetF blender/`) vont sous `Content/Assets/Environment/<Pack>/`, les bibliothèques d'animation sous `Content/Assets/Animations/`. Les imports dont le chemin est imposé par l'outil (Fab, Megaplant_Library, MetaHumans) restent où l'outil les met. **Exception assumée** : `KitFR/` et `ProjectF/` sont restés à la racine de `Content/` (2 000 et 1 600 assets ; les déplacer dans l'éditeur le fait planter par manque de mémoire, décision utilisateur du 2026-10-30).
```text
Content/Animations/ → Clips de mocap tiers : DeerAndDoe/, Fox/, Wolf/, humain/ (Armed_mov, Avoid, Carrying, Cover,
Effect_Animation, INteraction, Prone, Push, SwimmingAnimation…)
Content/Assets/Animations/ → Clips de mocap tiers : DeerAndDoe/, Fox/, Wolf/, humain/ (Armed_mov, Avoid, Carrying, Cover,
Effect_Animation, INteraction, Prone, Push, SwimmingAnimation…). Ex-`Content/Animations/` (déplacé le 2026-10-30).
Kimodo/ : animations générées par le skill kimodo-motion (Source/ = import du GLB skinné + IK_Kimodo_SOMA30
+ RTG_Kimodo_to_UEFN, Retargeted/ = anims retargetées sur l'UEFN Mannequin). Ex-`Content/Kimodo/`.
Content/Assets/Environment/ → Packs d'environnement faits pour le projet (déplacés ici le 2026-10-30) :
PropsParis/ (props urbains parisiens : mobilier, commerces, enseignes, débris ; meshes SM_PR_*),
RueDeParis/ (rue de test : sol, façades et décor RDP_*, script `kit_fr_scripts/ue_rdp.py`),
Bridges/ (voir ligne dédiée plus bas), Prop/Wooden_Door/ (porte en bois des BP de porte interactable).
Content/Characters/ → Meshes/matériaux/textures des personnages et animaux (Animal/DeerStagAndDoe|Fox|Wolf,
UEFN_Mannequin/ avec ses données de Motion Matching : AimOffset, Crouch, Idle, Jump,
MotionMatchingData/ [Channels, Databases, Normalization_Sets, Schemas], Poses, Run, Slide,
Sprint, Traversal, Walk, Rigs, Materials, Meshes, Textures)
MEtahuman/ : le MetaHuman `test` (asset MetaHuman Character `test`) et son assemblage
`Unpacked/test/` (BP_test, SKM_test_BodyMesh/FaceMesh, PHYS_test, matériaux baked), utilisé
par le visual override (§4.2.4). Ex-`Content/test/` (déplacé le 2026-10-30).
Content/Fab/ → Assets Fab/Quixel Megascans : MaterialFunctions/, MaterialParameterCollection/, Materials/
(Standard/VT), Megascans/Plants/ (Common_Hemp_Nettle, Wild_Grass ×2), Megascans/Surfaces/
(Damaged_Asphalt, Dirt_Ground, Forest_Floor), Textures/ (Standard/VT)
@@ -812,9 +833,13 @@ Content/ProjectF/ → **(2026-10-28)** Assets « Project F » (`Proje
26 assets lot 4) — mêmes slots que la version par défaut : les appliquer en surcharge de matériau
sur l'instance placée (exemples dans L_PF_Demo, acteurs tagués `PF_VARIANTES`, script
`Scripts/ue_pf_demo_variants.py`).
Content/Bridges/ → Kits de ponts générés dans Blender (Truss, Bailey, Geo ; `ProjetF blender/UE_Export/README.md`) : travées D0-D3,
Content/Assets/Environment/Bridges/ → Kits de ponts générés dans Blender (Truss, Bailey, Geo ; `ProjetF blender/UE_Export/README.md`) : travées D0-D3,
piles, culées, ponts entiers, un graphe PCG par kit. Le système PCG/RoadNetwork réutilise les travées Truss
(type `MetalAncien`). Dossier NON versionné dans git (2026-10-29).
(type `MetalAncien`). Dossier NON versionné dans git (2026-10-29). ⚠️ Déplacé le 2026-10-30 depuis
`Content/Bridges/` : en partie dans l'éditeur, et pour 81 fichiers de `Geo/` (matériaux + PCG), sur disque
éditeur fermé + `[CoreRedirects]` `/Game/Bridges/` → `/Game/Assets/Environment/Bridges/` (DefaultEngine.ini).
**Ne pas retirer cette redirection** : les ponts entiers `Geo/Full/SM_Geo_*` (90-180 Mo chacun) référencent
encore leurs matériaux par l'ancien chemin. Charger ces ponts demande ~10 Go de RAM chacun.
Content/Megaplant_Library/ → Végétation Megaplant : Plant_Bilberry/, Tree_European_Aspen/, Tree_Hornbeam/
(chacun avec Instances/, Materials/, Textures/)
Content/Audio/Foley/ → **(2026-09-08)** Système de sons de pas/foley du sample Game Animation Sample :
@@ -830,8 +855,10 @@ Content/Levels/, Content/Widgets/, Content/dev_map → **SUPPRIMÉS le 2026-09-
LevelPrototyping, widgets et map de démo). Seul lien avec le projet : le cast vers
`LevelBlock_Traversable` dans `Systems/Mover/AC_TraversalLogic`, retiré (voir §4.2.1).
Sauvegarde : commit git `6eb7516`.
Content/Thumbnails/ → Miniatures générées pour la Content Browser
Content/Misc/ → SandboxAnimCurveCompressionSettings.uasset (réglages de compression d'anim)
Content/Misc/ → SandboxAnimCurveCompressionSettings.uasset (réglages de compression d'anim, référencés par ~1 100
animations : laissé en place, le déplacer resauvegarderait toutes ces anims).
Content/Thumbnails/ → **SUPPRIMÉ le 2026-10-30** : T_aaa/T_bbbb (inutilisées) supprimées, T_SM_WaterBottle_Thumbnail
rangée dans `Items/ItemTextures/`.
Content/__ExternalActors__/ → ⚙️ Généré automatiquement par World Partition (données par-acteur des maps, ex. LocomotionAnimPack).
Content/__ExternalObjects__/ → ⚙️ Généré automatiquement par World Partition (objets externes liés aux maps).
→ Ces deux derniers dossiers ne doivent JAMAIS être édités ou documentés à la main :
@@ -973,6 +1000,14 @@ Ce projet est modifié via le plugin **VibeUE** (service MCP `unreal-mcp`, voir
- `EnumStructService.add_struct_property` : type `FSoftObjectPath` (`SoftObjectPath` échoue sans erreur). Un import CSV de DataTable avec des « problems » ouvre une boîte modale « Message » qui bloque le MCP.
- Débogage : *Export Selected Attributes* (JSON) écrit les points d'un nœud dans un fichier ; reconstruire un graphe régénère tous les composants qui l'utilisent (le fichier est celui du dernier acteur).
**Déplacer des assets en masse (rangement du 2026-10-30) :**
- **Map World Partition** : `AssetTools.rename_assets` ne déplace QUE les acteurs externes chargés. Les autres restent dans l'ancien dossier `__ExternalActors__`, rattachés à l'ancienne map, et disparaissent de la nouvelle. Toujours faire d'abord `WorldPartitionBlueprintLibrary.load_actors([d.guid for d in get_actor_descs()])` sur la map ouverte, puis le renommage, puis compter les fichiers `__ExternalActors__` avant/après.
- **Mémoire** : renommer un asset recharge et resauvegarde tous ses référenceurs. Déplacer un matériau des ponts entiers `Bridges/Geo/Full` (ou tout asset utilisé par de gros meshes Nanite) les recharge et les recompile (~10 Go chacun) → « Ran out of memory / fichier de pagination insuffisant ». La mémoire n'est pas rendue après un lot, même avec `collect_garbage()` : redémarrer l'éditeur tous les 2-3 gros meshes. Pour les dossiers trop lourds, déplacer sur disque éditeur fermé + `[CoreRedirects]` `MatchSubstring` (méthode utilisée pour Bridges).
- **Copies fantômes** : `rename_assets` renvoie True mais laisse parfois l'ancien fichier sur disque comme un VRAI asset (pas un redirecteur) ; c'est arrivé pour des SkeletalMesh, PhysicsAsset, DNA, textures de MetaHuman et Kimodo. Après un déplacement, chercher dans l'ancien dossier les fichiers sans `ObjectRedirector`, vérifier qu'ils ne sont référencés par rien, puis les supprimer.
- Ne jamais garder une référence Python à un monde (`w = get_editor_world()`) au moment de charger un autre niveau : assertion « World Memory Leaks » et plantage. Faire le chargement dans une fonction, sans variable globale.
- Il n'existe pas d'API Python pour « Fix Up Redirectors » : resauvegarder les référenceurs (`EditorLoadingAndSavingUtils.save_packages`), vérifier qu'il n'y en a plus, puis effacer les redirecteurs.
- `EditorAssetLibrary.delete_asset` sur une map ou un asset très référencé peut prendre plusieurs minutes (l'éditeur vérifie les références de tout le projet) ; `delete_loaded_assets` sur une liste est beaucoup plus rapide.
---
## 10. Maintenir ce document à jour
@@ -1015,3 +1050,4 @@ Ce document **doit toujours refléter l'état réel du projet**. Un skill dédi
- *2026-09-27 (port des systèmes AST Cover + Interaction, voir §4.2.5) : contenu AST copié sous `Systems/Movement/{Cover,Interaction,StateManager}` et réparé par `[CoreRedirects]` ; nouveau `Systems/Movement/ASTShared/` (dépendances minimales des autres plugins AST) et map de test `Systems/Movement/Test/L_ASTCoverTest` ; `SandboxCharacter_Mover` reçoit `BPC_StateManager`/`BPC_CoverSystem`/`BPC_Interaction` et les overrides de déplacement ; `SandboxCharacter_Mover_ABP` lie `OverlayGraph` et `InteractionIKGraph` ; `IMC_Sandbox` : A → `IA_TakeCover` ; tables de tags AST ajoutées à `DefaultGameplayTags.ini`. `AC_Cover` supprimé (par l'utilisateur).*
- *2026-10-28/29 : nouveau système `Content/PCG/RoadNetwork/` (routes et ponts post-apo, voir §7 et `Docs/PCG_RoutesPonts.md`), dossier racine `Docs/`, ligne `Content/Bridges/` ajoutée en §8, pièges PCG en §9. Le prototype `Content/PCG/Road/` est conservé tel quel. Aucun asset existant modifié ni supprimé (seul le dossier d'essai `RoadNetwork/_Spike`, créé et supprimé pendant le travail).*
- *2026-10-30 : nouveau système `Content/PCG/Haussmann/` (immeubles haussmanniens, voir §7 et `Docs/PCG_Haussmann.md` + `Docs/PCG_Haussmann_captures/`), pièges PCG ajoutés en §9 ; scripts hors projet dans `E:/projet/PF_Haussmann_Work/scripts`.*
- *2026-10-30 (rangement de `Content/`) : toutes les maps de test regroupées dans `Content/Maps/DevTest/` (+ `HLOD/`) ; packs `PropsParis`, `RueDeParis`, `Bridges`, `Prop` → `Content/Assets/Environment/`, `Animations` + `Kimodo` → `Content/Assets/Animations/`, `Content/test` (MetaHuman) → `Characters/MEtahuman/Unpacked/test`. `KitFR/` et `ProjectF/` laissés à la racine (trop lourds à déplacer). Supprimés : 249 assets AST inutilisés du StateManager, maps de démo (`ShowcaseMap`, 2× `DefaultLevel1`, UltraDynamicSky `DemoMap`), `Untitled_HLOD0_Instancing`, `PCG/test/NewPCGGraph1`, `Thumbnails/T_aaa|T_bbbb`, ~280 redirecteurs, dossiers vides. `[CoreRedirects]` ajouté pour `/Game/Bridges/`. Notifies AST `ReloadNotify`/`SetEquippedWeapon` vidés. Chemins mis à jour dans les scripts `ProjetF blender/` et le skill kimodo-motion. Vérifié : 476 Blueprints compilent sans erreur, PIE MapDev1 sans erreur. Sauvegarde : `E:\projet\ProjectFv1_backup_reorg_2026-10-30\` + commit `e829ff2`. Pièges en §9.*
+2
View File
@@ -218,6 +218,8 @@ PlatformSettings=()
[CoreRedirects]
+PackageRedirects=(OldName="/Game/UltraDynamicSky/Particles/UDW_Niagara_Parameters",NewName="/Game/Systems/Weather/UltraDynamicSky/Particles/UDW_Niagara_Parameters")
+PackageRedirects=(OldName="/Game/UltraDynamicSky/Particles/UDS_VolumetricClouds_Niagara_Properties",NewName="/Game/Systems/Weather/UltraDynamicSky/Particles/UDS_VolumetricClouds_Niagara_Properties")
; Rangement 2026-10-30 : Bridges deplace sur disque (editeur ferme, trop lourd a deplacer dans l'editeur)
+PackageRedirects=(OldName="/Game/Bridges/",NewName="/Game/Assets/Environment/Bridges/",MatchSubstring=true)
; Port AST (2026-09-27) : contenu des plugins AST copie a la main dans Content/Systems/Movement
+PackageRedirects=(OldName="/AST_CoverSystem/",NewName="/Game/Systems/Movement/Cover/",MatchSubstring=true)
+PackageRedirects=(OldName="/AST_InteractionSystem/",NewName="/Game/Systems/Movement/Interaction/",MatchSubstring=true)
-1
View File
@@ -10,7 +10,6 @@ bDynamicReplication=False
InvalidTagCharacters="\"\',"
+GameplayTagTableList=/Game/Data/DT_DemoTags.DT_DemoTags
+GameplayTagTableList=/Game/Systems/Movement/StateManager/Blueprints/Data/AST_GameplayTagDT.AST_GameplayTagDT
+GameplayTagTableList=/Game/Systems/Movement/StateManager/Blueprints/Data/AST_StateTreeGameplayTagDT.AST_StateTreeGameplayTagDT
NumBitsForContainerSize=6
NetIndexFirstBitSegment=16
+GameplayTagList=(Tag="Foley.Event.Handplant",DevComment="Game Animation Sample tags (Foley / SmartObjects)")
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loaded 100 of 791 files, more files were not shown because too many files have changed in this diff. Show more