From 8bada02b9b2d1a95ab671082b10a5fa93f9ecd2e Mon Sep 17 00:00:00 2001 From: edujiro5972 <336072401+edujiro5972@users.noreply.github.com> Date: Tue, 29 Sep 2026 08:59:24 +0200 Subject: [PATCH] L5 : diagnostic ERR-027 et instrumentation de GetAssetByObjectPath Diff 4.27/5.5 des fonctions de chargement des maillages (GenerateAndApply*, LoadMeshIfNeeded, getSkeletalMeshFromPath, SMBoolToSkeletalMesh) : logique identique. Seul maillon change : resolution chemin -> asset. Instrumentation : chaque chemin non resolu signale une fois (LogLifePlay). Build L5a : 8561 packages, cuisson 0 erreur. Co-Authored-By: Claude Opus 5.5 --- Docs/Migration/Journal_Modifications.md | 29 ++++++++++++++++++++++ Source/LifePlay/LPAssetRegistryHelpers.cpp | 24 +++++++++++++++--- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/Docs/Migration/Journal_Modifications.md b/Docs/Migration/Journal_Modifications.md index 7ef6f87..be8187b 100644 --- a/Docs/Migration/Journal_Modifications.md +++ b/Docs/Migration/Journal_Modifications.md @@ -256,3 +256,32 @@ Build `D:\Game\LifePlay_Build_5.5_L4b` (`BuildCookRun` Development, journal `L4b | Premier A/B (`LogStats -Compare`, échantillon faible) | `Accessed None` maillage/perso **0,50** (4.27 : 0,27 ; 5.5 du 28/09 : 16,6) ; **4 acteurs distincts sur 4** (5.5 du 28/09 : tous `Person_C_0`) → CX-B01 corrige très probablement ERR-002 ; **à confirmer visuellement** (T-RUN-02 à 04) | `LifePlay_Build_5.5_L4` (incomplète) est conservée comme preuve et peut être supprimée. + +--- + +## Lot L5 — Données et personnages (2026-09-29) + +### Diagnostic d'ERR-027 (personnages de quête invisibles ou dévêtus) + +Partie jouée par l'utilisateur sur `LifePlay_Build_5.5_L4b` (journal archivé +`Saved/Logs/portage/L4b_partie_utilisateur_20260929.log`) : PNJ aléatoires corrects ; personnages +créés par preset invisibles en dialogue, dévêtus dans le mini-jeu. + +| Étape | Constat | Preuve | +|---|---|---| +| Indicateur | `Accessed None` maillage : 26,5 / personnage (1 219 / 46) contre 0,27 en 4.27 (4 / 15) | `Tools\LogStats.ps1` | +| Pile d'appel | `GeneratePerson → LoadPreset → GenerateAndApplyStrings/Bools` lit `MeshSexRace.Mesh` et `SMBool.SkeletalMesh` vides ; 0 occurrence en 4.27 | journal utilisateur | +| Pistes écartées (identiques en 4.27) | `clearVariable` (ERR-028, 211 contre ≈ même nombre en 4.27) ; `populateClothes4` / `ParseIntoArray` (631 contre 630) | `Grep` sur les deux journaux | +| Structures | `Mesh_2…` ∈ `Structs/MeshSexRace` ; `SkeletalMesh_2…` ∈ `Structs/SMBool` | recherche binaire | +| Diff de graphes 4.27 / 5.5 (`LPDumpFunction`) | `GenerateAndApplyStrings`, `GenerateAndApplyBools`, `LoadMeshIfNeeded`, `getSkeletalMeshFromPath`, `SMBoolToSkeletalMesh` : **logique identique** (seuls écarts : `SetSkeletalMesh` → `SetSkinnedAssetAndUpdate`, redirection moteur ; broche `Key` du `PrintString` UE5) | `etat/L5-diag_dump427_*`, `etat/L5-diag_dump55_*` | +| Mécanisme | `MeshSexRace` est chargé à la demande : `LoadMeshIfNeeded(Index)` → `getSkeletalMeshFromPath(AssetPath)` → `LPAssetRegistryHelpers::GetAssetByObjectPath(…, OnlyOnDisk=true)` → `GetAsset` → `Cast` | dumps | +| Réglages | `LegacyPercentage` absent des deux `GameSettings.sav` : valeur par défaut identique | lecture binaire | + +Conclusion provisoire : code et réglages identiques ; le seul maillon qui change de moteur est la +résolution chemin → asset (`GetAssetByObjectPath`, porté de `FName` vers `FSoftObjectPath`). + +| ID | Date | Lot | Fichiers | Raison | Retour arrière | +|---|---|---|---|---|---| +| CHG-027 | 2026-09-29 | L5 | `Source/LifePlay/LPAssetRegistryHelpers.cpp` | instrumentation permanente : tout chemin non résolu est signalé une fois (`LogLifePlay` Warning, chemin reçu et chemin interprété), réussites en `Verbose` | `Tools\Restore.ps1 -Lot L5-instr` | + +Build `D:\Game\LifePlay_Build_5.5_L5a` (instrumentée) : éditeur et jeu compilés sans erreur ; cuisson `0 error(s), 0 warning(s)` ; T-PKG-01 : 8 561 packages ; test de fumée 180 s sans plantage (aucune partie démarrée : pas de sauvegarde dans cette build). En attente d'une scène de quête jouée. diff --git a/Source/LifePlay/LPAssetRegistryHelpers.cpp b/Source/LifePlay/LPAssetRegistryHelpers.cpp index b8ab09f..88bf01c 100644 --- a/Source/LifePlay/LPAssetRegistryHelpers.cpp +++ b/Source/LifePlay/LPAssetRegistryHelpers.cpp @@ -2,6 +2,7 @@ #include "LPAssetRegistryHelpers.h" +#include "LifePlay.h" #include "AssetRegistry/AssetRegistryModule.h" #include "AssetRegistry/IAssetRegistry.h" #include "Modules/ModuleManager.h" @@ -17,9 +18,26 @@ FAssetData ULPAssetRegistryHelpers::GetAssetByObjectPath(const FName ObjectPath, const FSoftObjectPath Path(ObjectPath.ToString()); const FAssetData Result = AssetRegistryModule.Get().GetAssetByObjectPath(Path, bIncludeOnlyOnDiskAssets); - // Diagnostic du 2026-09-08 : cette fonction a ete instrumentee pour verifier qu'elle - // n'etait pas en cause dans l'absence de maillage des personnages. Elle ne l'etait pas - // (2720 resolutions reussies sur 2776). Le defaut venait de GetAssetsByClass, ci-dessous. + // Lot L5 (ERR-027) : tout chemin non resolu est signale une fois, avec la forme exacte + // recue et celle interpretee par FSoftObjectPath. Les maillages charges par chemin + // (corps, vetements, coiffures) passent tous par ici ; un echec produit un personnage + // sans maillage, sans aucune autre trace. + if (!Result.IsValid()) + { + // Appele depuis les Blueprints, donc sur le thread de jeu. + static TSet ReportedFailures; + bool bAlreadyReported = false; + ReportedFailures.Add(ObjectPath, &bAlreadyReported); + if (!bAlreadyReported) + { + UE_LOG(LogLifePlay, Warning, TEXT("GetAssetByObjectPath ECHEC | recu '%s' | interprete '%s' (valide=%d) | OnlyOnDisk=%d"), + *ObjectPath.ToString(), *Path.ToString(), Path.IsValid() ? 1 : 0, bIncludeOnlyOnDiskAssets ? 1 : 0); + } + } + else + { + UE_LOG(LogLifePlay, Verbose, TEXT("GetAssetByObjectPath OK | '%s'"), *ObjectPath.ToString()); + } return Result; }