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:
parent
6038ef3143
commit
8bada02b9b
2 changed files with 50 additions and 3 deletions
|
|
@ -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<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.
|
||||
|
|
|
|||
|
|
@ -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<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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue