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 <noreply@anthropic.com>
This commit is contained in:
edujiro5972 2026-09-29 08:59:24 +02:00
parent 6038ef3143
commit 8bada02b9b
2 changed files with 50 additions and 3 deletions

View file

@ -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) | | 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. `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<SkeletalMesh>` | 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.

View file

@ -2,6 +2,7 @@
#include "LPAssetRegistryHelpers.h" #include "LPAssetRegistryHelpers.h"
#include "LifePlay.h"
#include "AssetRegistry/AssetRegistryModule.h" #include "AssetRegistry/AssetRegistryModule.h"
#include "AssetRegistry/IAssetRegistry.h" #include "AssetRegistry/IAssetRegistry.h"
#include "Modules/ModuleManager.h" #include "Modules/ModuleManager.h"
@ -17,9 +18,26 @@ FAssetData ULPAssetRegistryHelpers::GetAssetByObjectPath(const FName ObjectPath,
const FSoftObjectPath Path(ObjectPath.ToString()); const FSoftObjectPath Path(ObjectPath.ToString());
const FAssetData Result = AssetRegistryModule.Get().GetAssetByObjectPath(Path, bIncludeOnlyOnDiskAssets); const FAssetData Result = AssetRegistryModule.Get().GetAssetByObjectPath(Path, bIncludeOnlyOnDiskAssets);
// Diagnostic du 2026-09-08 : cette fonction a ete instrumentee pour verifier qu'elle // Lot L5 (ERR-027) : tout chemin non resolu est signale une fois, avec la forme exacte
// n'etait pas en cause dans l'absence de maillage des personnages. Elle ne l'etait pas // recue et celle interpretee par FSoftObjectPath. Les maillages charges par chemin
// (2720 resolutions reussies sur 2776). Le defaut venait de GetAssetsByClass, ci-dessous. // (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<FName> 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; return Result;
} }