30 KiB
Fiche OBA-T23-EDIT — Niveau N3 — Modèle prévu modèle de l'agent lp-cart | utilisé Opus 5.5 (claude-opus-5-5) — Agent lp-cart — Skills sk-protocol, lp-paths (préchargés aussi : ue-cpp-build, lp-commandlets)
OBA-T23-EDIT-CART : plugins éditeur, expérimentaux et d'IA montés dans le jeu empaqueté (2026-10-09)
Copie lue : D:\Game\LifePlay-master 5.8 (branche ue5.8, HEAD 657ce7f, état propre au début de la session). Moteur : D:\Game\Launcher\Engine\UE_5.8\Engine (sources UBT et .uplugin présents, lus). Rien lancé : ni UE, ni commandlet, ni build. Seul fichier écrit : ce livrable.
Abréviations : JEU = D:\Game\LifePlay_Build_5.8_Development_U8_essai\Windows\LifePlay\Saved\Logs\LifePlay.log ; RCT-S = Binaries\Win64\LifePlay-Win64-Shipping.target (reçu de cible Shipping) ; RCT-D = Binaries\Win64\LifePlay.target ; RCT-E = Binaries\Win64\LifePlayEditor.target ; RSP-S = Intermediate\Build\Win64\x64\LifePlay\Shipping\LifePlay-Win64-Shipping.exe.rsp (fichier de réponse de l'éditeur de liens : liste des .obj/.lib liés) ; RSP-D = ...\Development\LifePlay.exe.rsp ; UFS-S = D:\Game\LifePlay_Build_5.8_Shipping_U8\Windows\Manifest_UFSFiles_Win64.txt (fichiers mis dans le paquet) ; UBT = Engine\Source\Programs\UnrealBuildTool\Configuration\UEBuildTarget.cs ; CSV = OBA-T1-plugins.csv.
1. Objet et périmètre
Un seul domaine : pourquoi des plugins d'outils éditeur, expérimentaux ou d'IA sont montés dans le jeu empaqueté, et ce qu'ils y apportent, sur trois niveaux distincts :
(a) monté (ligne Mounting … plugin au journal du jeu, descripteur .uplugin mis dans le paquet) ;
(b) code (modules du plugin liés dans l'exe du jeu, preuve : RSP) ;
(c) contenu cuit (fichiers du plugin sous Saved\Cooked\Windows et dans UFS-S).
Plugins : les 8 nommés au .uproject avec TargetAllowList: ["Editor"] mais montés en jeu (ConcertMain, ConcertSyncClient, ConcertSyncCore, HairStrands, Interchange, InterchangeAssets, PythonScriptPlugin, Takes), plus ConcertSharedSlate (même chaîne que Concert, hors liste de la fiche), HyperAIStudio, ModelContextProtocol, ToolsetRegistry, EditorToolset, MCPClientToolset, Terminal et les 15 toolsets du .uproject (LifePlay.uproject:211-315).
Grille d'action : O3 du doc 30 (30_Projet_Audit_Obsolescence.md:37 : utilisé, état 5.8, service rendu, coût mesuré, action garder / désactiver / remplacer / corriger, risque).
2. Commandes et lectures (exactes) avec compte brut
Livrables amont relus : OBA-T1-INV.md, OBA-T4-INV.md (Read, en entier) ; CSV (Grep, lignes du périmètre).
- Read
LifePlay.uproject(323 lignes, en entier). - Glob
Binaries/Win64/*.{target,modules,version}→ 4 fichiers (UnrealEditor.modules, RCT-E, RCT-S, RCT-D). GlobIntermediate/Build/Win64/x64/LifePlay/*/*.rsp→ 4 (dont RSP-S et RSP-D). - Dates (pwsh
Get-Item … LastWriteTime) : RSP-S 17:55:57, exe Shipping 17:56:48 (164 823 552 o), RCT-S 17:56:49 ; RSP-D 18:17:38, exe Development 18:18:26 (330 686 464 o), RCT-D 18:18:28. Ce sont les produits des compilations U8 (U8_Build_20261009-175553.log,-181732.log; tailles d'exe égales àOBA-T4-INV.md§ 2.2). - Grep RCT-S, motif
Concert|HairStrands|Interchange|PythonScript|Takes|HyperAIStudio|ModelContextProtocol|Toolset|Terminal,count→ 26 lignes (13 dansRuntimeDependencies, 13 dansBuildPlugins), puiscontent. - Grep RCT-S, RCT-D, RCT-E (
-i), motif des 20 noms de la famille MCP + requérants → famille MCP : 0 ligne dans RCT-S et RCT-D, 20 dans RCT-E (lignes 36727-36978). - Grep RSP-S, motif
Concert|HairStrands|HairCard|Interchange|GLTFCore|Python|Take|CacheTrackRecorder|HyperAI|ModelContext|Toolset|Terminal|ConsoleVariables|NiagaraSimCaching|ChaosCaching|GLTFExporter(content) ; recompte par un second motifConcert|HairStrands|Interchange|GLTFCore|Python|/Take|HyperAI|ModelContext|Toolset|Terminal(count) : RSP-S 44, RSP-D 44. - Glob
Plugins/VirtualProduction/Takes/Intermediate/Build/Win64/x64/UnrealGame/Shipping/**/*.obj(moteur) → 6.obj: les chemins../Plugins/…de RSP-S sont relatifs àEngine\Source(RSP-S:2../Build/Windows/Resources/…), donc àEngine\Plugins. - Grep JEU, motif
Concert|Takes|TakeRecorder|Python|Interchange|HyperAI|HairStrands|ModelContext|Toolset→ 16 lignes (13Mounting, 1LogDevObjectVersion, 3Set CVar r.HairStrands…) ; aucune ligneModelContextProtocolni toolset horsMeshModelingToolset. - Contenu cuit (pwsh, Glob ayant rendu 0 sous
Saved\Cooked, voir § 5) :Get-ChildItem 'Saved\Cooked\Windows\LifePlay\Plugins' -Recurse -File→ 2 fichiers, tous deux de StreetMap (799 + 39 390 o) ;Get-ChildItem 'Saved\Cooked\Windows\Engine\Plugins' -Recurse -File, regroupé par dossier de plugin → 207 fichiers, 4 492 970 o, 10 plugins : ACLPlugin 4, ControlRig 116, DeformerGraph 10, Landmass 22, MeshModelingToolsetExp 6, Water 29, MediaPlate 2, PCG 6, AudioWidgets 2, HairStrands 10 / 650 122 o ; liste des 10 fichiers HairStrands (5 matériaux.uasset+.uexp, datés 18:07:52-18:08:28 local = cuisson U8-T3). - Grep UFS-S, motif
Concert|HairStrands|/Interchange|Python|/Takes/|HyperAI|ModelContext|Toolset|/Terminal/|upluginmanifest(content) ; recompte ancré^(Engine/Plugins/(Developer/Concert|Experimental/InterchangeAxF|Experimental/PythonScriptPlugin|Interchange|Runtime/HairStrands|VirtualProduction/Takes|Experimental/ModelContextProtocol|Experimental/Toolset|Experimental/Terminal)|LifePlay/Plugins/Marketplace): Shipping 29, Development 29.Manifest_NonUFSFiles_Win64.txt(Shipping), même famille de motifs : 0. - Grep
"Name"\s*:\s*"(Takes|ConcertMain|…|HyperAIStudio)"dansEngine\Plugins\**\*.uplugin(requérants de chaque plugin), puis croisement avec CSV (monte_jeu) ; Grep des requérants de second rang (ChaosCaching|SequencerScripting|InterchangeEditor|…). - Read des descripteurs :
ConsoleVariables.uplugin(49 l.),NiagaraSimCaching.uplugin(40),Interchange.uplugin(122),InterchangeEditor.uplugin:8-57,GLTFExporter.uplugin(42),ChaosCaching.uplugin:10-36,ChaosCloth.uplugin:10-39,Dataflow.uplugin:50-63,ControlRig.uplugin:10-37,Niagara.uplugin:1-26,RigVM.uplugin:40-53,PluginUtils.uplugin(36),SequencerScripting.uplugin:8-27,HyperAIStudio.uplugin:1-40et:344-478. - Read UBT:5630-5737, 5740-5779, 5800-5919 ; Grep UBT
bDescriptorNeededAtRuntime =|bDescriptorReferencedExplicitly =; Read UBT:2515-2544 ; ReadSystem\Plugins.cs:108-129; ReadRuntime\Projects\Private\PluginManager.cpp:2405-2479; GrepPluginManager.cppUBT_TARGET_BUILD_PLUGINS(l.1462). - Grep
Source(Groom|HairStrands|TakeRecorder|Interchange|Python|Concert|HyperAI) → 4 lignes, toutes HyperAIStudio dansLifePlayEditorTools(module Editor). GrepConfig(même motif +ModelContextProtocol) → 3 lignes (DefaultGame.ini:59,60,72) ; ReadDefaultGame.ini:40-89. - Grep
HairStrands\Source(noms des 5 matériaux) →GroomComponent.cpp:1499-1502. GrepPythonScriptPluginPreload(WITH_PYTHON|bBuildEditor) →PythonScriptPluginPreload.Build.cs:16,26. - HyperAIStudio : pwsh
Get-ChildItempar sous-dossier → Binaries 51 / 1 712 641 848 o, Content 1 / 204 o (Content\HyperAIStudio\README.md), Docs 1, Intermediate 554, Resources 2, Source 248 ;git check-ignore -v→.git/info/exclude:15:/Plugins/Marketplace/(code 0) ;git status --porcelain --ignored -- Plugins/Marketplace→!! Plugins/Marketplace/. - Doc 29 : Grep
TargetAllowList→ l.140 ; Read29_Projet_Stabilisation_V2.md:130-149. - Web : WebSearch « Unreal Engine 5.8 release notes Model Context Protocol toolsets experimental plugin » ; WebSearch « … TargetAllowList Editor still packaged dependency … » ; WebFetch des notes de version 5.8 (lu : caractères 0-100 000 sur 357 273).
3. Constats fichier:ligne
3.1 Mécanisme commun (UBT et gestionnaire de plugins à l'exécution)
- Une entrée du
.uprojectest d'abord inscrite dansReferencedNames(UBT:5661), puis passée àAddPlugin(UBT:5667). Pour la cible Game, une entréeTargetAllowList: ["Editor"]est rejetée parif (!Reference.IsEnabledForTarget(TargetType)) … return null(UBT:5840-5844). - Le passage « plugins activés par défaut » saute tout nom déjà dans
ReferencedNames(UBT:5680). L'entrée Editor du.uprojectretire donc aussi l'activation par défaut côté Game (cas d'Interchange,EnabledByDefault: trueàInterchange.uplugin:13). - En revanche, une dépendance déclarée dans le
.uplugind'un plugin activé pour le jeu est une nouvelle référence, sans liste de cibles : elle passe les contrôles de UBT:5827-5844 et le plugin est activé (relu pour le chemin de l'instance existante, UBT:5816-5820 ; chemin de la nouvelle instance non relu ligne à ligne, voir § 4). Une référenceOptional: trueactive quand même le plugin s'il est trouvé :bOptionalne joue qu'en cas d'absence (UBT:5878-5883). - Même règle à l'exécution :
PluginManager.cpp:2425-2429ignore une référence non permise pour la cible et suit les dépendances de la file (:2417-2420). - Descripteur mis dans le paquet : référence non optionnelle (
bDescriptorReferencedExplicitly = !Reference.bOptional, UBT:5932) ou pluginCanContainContent/dépendance qui en a besoin (UBT:5996-5999). Ajout aux dépendances d'exécution du reçu : UBT:2519-2525. Le jeu empaqueté litLifePlay/Plugins/LifePlay.upluginmanifest(UFS-S:22069). - Modules : seuls les types autorisés pour Game sont compilés. Les modules
EditoretUncookedOnlysont absents de RSP-S (preuves par plugin ci-dessous).
3.2 Concert (ConcertMain, ConcertSyncClient, ConcertSyncCore, plus ConcertSharedSlate)
.uproject:LifePlay.uproject:176-196(Editor). Monté : JEU:89-92. Reçu Shipping : RCT-S:3360-3372 (descripteursUFS), RCT-S:4018-4021 (BuildPlugins).- Chaîne :
ConsoleVariables.uplugin:11(EnabledByDefault: true) requiert les quatre sans option (:18-35). ConsoleVariables est dans le jeu (RCT-S:4022, CSV:68defaut, jeu = oui). Les autres requérants trouvés dans le moteur (DisplayClusterLaunch, Composite, LiveLink, RemoteControl, nDisplay, ColorCorrectRegions, SequencerPlaylists, CineCameraRigs, MultiUser*) ne sont pas montés dans le jeu (CSV : absents, ou LiveLink:145 jeu = non). - Code : modules tous
UncookedOnly(CSV:63-66) → 0 ligne Concert dans RSP-S. Le requérant apporteConsoleVariablesEditorRuntime(RSP-S:787). - Contenu : 0 fichier cuit ; dans le paquet, 4
.uplugin(UFS-S:817-820) etDefaultConcertSyncCore.ini(UFS-S:1667).
3.3 Takes
.uproject::197-203(Editor). Monté : JEU:234. Reçu : RCT-S:3916, :4165.- Chaînes : (1)
NiagaraSimCaching.uplugin:13(EnabledByDefault: true),:30-34→ Takes. (2)ChaosCaching.uplugin:30-35→ Takes ; ChaosCaching (EnabledByDefault: false,:13) est requis parChaosCloth.uplugin:28-32(EnabledByDefault: true,:13) etDataflow.uplugin:57-60. Les quatre requérants sont dans le jeu (RCT-S:4004 ChaosCaching, :4117 NiagaraSimCaching ; RCT-S:3340 ChaosCloth, :3352 Dataflow). - Code : 6 modules Runtime liés : TakeMovieScene, TakesCore, TakeTrackRecorders, TakeRecorder, TakeRecorderSources, TakeRecorderNamingTokens (RSP-S:1097, 1100, 1102-1105). Absents : TakeRecorderEditor, CacheTrackRecorder (
UncookedOnly), TakeSequencer (Editor) (CSV:248). Requérants liés : NiagaraSimCaching (RSP-S:964), ChaosCaching (RSP-S:762). - Contenu : 0 fichier cuit (
DefaultGame.ini:71DirectoriesToNeverCook=/Takes, lot O1) ; paquet :Takes.uplugin(UFS-S:956) etDefaultTakes.ini(UFS-S:1702).
3.4 PythonScriptPlugin
.uproject::204-210(Editor). Monté : JEU:156. Reçu : RCT-S:3608, :4142.- Chaînes : (1)
Niagara.uplugin:13(EnabledByDefault: true),:17-21→ PythonScriptPlugin, sans option ni liste de cibles. (2)ControlRig.uplugin:13,:30-33→ SequencerScripting ;SequencerScripting.uplugin:17-21→ PythonScriptPlugin. Pas par RigVM (RigVM.uplugin:45-50, Editor) ni PluginUtils (PluginUtils.uplugin:29-34,Enabled: false, optionnel, Editor). Niagara RCT-S:4114, SequencerScripting RCT-S:4155. - Code : 1 module lié,
PythonScriptPluginPreload(RSP-S:1008, Runtime,EarliestPossible) ; le modulePythonScriptPlugin(UncookedOnly) est absent. Hors éditeur, le module est compilé avecWITH_PYTHON=0(PythonScriptPluginPreload.Build.cs:16testeTarget.bBuildEditor,:26WITH_PYTHON=0). Aucune DLL Python mise en paquet (NonUFS : 0). - Contenu : 0 fichier cuit (
DefaultGame.ini:72) ; paquet :PythonScriptPlugin.upluginseul (UFS-S:879).
3.5 Interchange et InterchangeAssets
.uproject: Interchange:80-91, InterchangeAssets:92-98(Editor). Monté : JEU:167 et :165 (InterchangeEditor :166, InterchangeAxfAssets :148). Reçu : RCT-S:3652, :3644, :3648, :3576 ;BuildPluginsRCT-S:4077-4080.- Chaîne Interchange :
GLTFExporter.uplugin:12(EnabledByDefault: true),:27-36(Interchange,Optional: true, ce qui l'active quand même) ; GLTFExporter est dans le jeu (RCT-S:4055, CSV:120). Pas par InterchangeEditor (InterchangeEditor.uplugin:51-57: Interchange limité àEditor,Program). Les autres extensions Interchange ne sont pas dans le reçu Game (Grep RCT-S : seuls Interchange, InterchangeAssets, InterchangeAxfAssets, InterchangeEditor). - Chaîne InterchangeAssets :
Interchange.uplugin:115-118,GLTFExporter.uplugin:37-40,InterchangeAxfAssets.uplugin:26(InterchangeAxfAssets activé par défaut, CSV:132). - Code : 11 modules d'Interchange liés (16
.obj) : GLTFCore, InterchangeNodes, InterchangeCommon, InterchangeFactoryNodes, InterchangeMessages, InterchangeDispatcher, InterchangeCommonParser, InterchangeImport, InterchangeExport, InterchangePipelines, InterchangeAnalytics (RSP-S:842-845, 900-912). S'y ajoutedraco.lib(RSP-S:41, 1175). InterchangeFbxParser est absent (Interchange.uplugin:79-91, module limité àEditor,Program). InterchangeAssets : 1 module (RSP-S:913) ; InterchangeAxFAssets (RSP-S:914) ; GLTFExporter (RSP-S:846-847). InterchangeEditor : modulesEditorlimités àEditor,Program(InterchangeEditor.uplugin:22-49), 0 dans RSP-S. Les modules moteurInterchangeCore,InterchangeEngine(RSP-S:841, 844, sousEngine\Intermediate) ne viennent pas du plugin. - Contenu : 0 fichier cuit (
DefaultGame.ini:59-60) ; paquet : 3.uplugin(UFS-S:888-890), 2.ini(UFS-S:1683-1684).
3.6 HairStrands
.uproject::134-140(Editor). Monté : JEU:210. Reçu : RCT-S:3824, :4070.- Chaîne :
Interchange.uplugin:95-98→ HairStrands. C'est le seul requérant monté dans le jeu : USDCore, MetaHumanSDK (CSV:262, 165, jeu = non) ; USDImporter, AlembicHairImporter, MetaHuman*, HairCardGenerator, HairModelingToolset, MeshResizing, MeshPartition, HairStrandsMutable absents du CSV. Chaîne complète : GLTFExporter (activé par défaut) → Interchange → HairStrands. - Code : 4 modules Runtime liés (8
.obj) : HairStrandsCore (RSP-S:836-840), HairStrandsSolver (:868), HairStrandsDeformer (:869), HairStrandsRuntime (:870). Absents : HairStrandsEditor, HairCardGeneratorFramework, HairStrandsDataflow (Editor, CSV:124). - Contenu : 10 fichiers cuits, 650 122 o (
Saved\Cooked\Windows\Engine\Plugins\Runtime\HairStrands\Content\Materials\, 5 matériaux), mis en paquet (UFS-S:12936-12945), avecHairStrands.uplugin(UFS-S:933) etDefaultHairStrands.ini(UFS-S:1692). Origine : 4 de ces matériaux sont chargés par le constructeur deUGroomComponent(GroomComponent.cpp:1499-1502,ConstructorHelpers::FObjectFinder)./HairStrandsn'est pas dansDirectoriesToNeverCook(DefaultGame.ini:58-73). - Les 23 lignes
LifePlay/Content/…HairStrands…d'UFS-S (ex. l.9308) sont des assets du jeu, nommés ainsi. Elles ne viennent pas du plugin et ne sont pas comptées.
3.7 HyperAIStudio
- Non nommé au
.uproject(LifePlay.uproject:21-316, lu en entier). Son.upluginn'a pasEnabledByDefault(HyperAIStudio.uplugin:1-18). Plugin du projet, donc activé par défaut (Plugins.cs:115-121pour le champ présent ; branche du champ absent :PluginManager.cpp:421-435selonOBA-T1-INV.md§ 4, non relu ici). Monté : JEU:237. Reçu : RCT-S:3952 (descripteurUFS), :4072. - Descripteur mis en paquet parce que
"CanContainContent": true(HyperAIStudio.uplugin:14; UBT:5996-5999) : UFS-S:961. - Dépendances : 20 entrées
Enabled: false(HyperAIStudio.uplugin:346-426), ignorées (UBT:5773-5777). 5 entrées MCPEnabled: truelimitées àEditor(:427-476: ModelContextProtocol, ToolsetRegistry, EditorToolset, MCPClientToolset, Terminal). HyperAIStudio n'entraîne donc aucun plugin dans le jeu. - Code : 25 modules, tous
Editor(CSV:126) → 0 ligneHyperAIdans RSP-S. - Contenu : dossier
Content= 1 fichier non asset (README.md, 204 o) → 0 fichier cuit (Saved\Cooked\Windows\LifePlay\Pluginsne contient que StreetMap). Dans le paquet : le seul.uplugin. - Dépôt : ignoré par
.git/info/exclude:15(exclusion locale, pas.gitignore) ; installé et non commité (doc 29:138-139).
3.8 Famille MCP : ModelContextProtocol, ToolsetRegistry, EditorToolset, MCPClientToolset, Terminal et les 15 toolsets
- Non montés dans le jeu : CSV:6, 14, 31, 67, 80, 93, 109, 144, 157, 170, 178, 186, 202, 205, 211, 238, 243, 251, 254, 259 (
monte_jeu= non pour les 20). JEU : 0 ligneModelContext, aucun toolset. - Absents des reçus Game : 0 ligne dans RCT-S et RCT-D. Présents dans RCT-E (20 lignes, 36727-36978).
- Code : 0 dans RSP-S et RSP-D. Contenu : 0 dans UFS-S.
- Raison : les 15 toolsets portent
TargetAllowList: ["Editor"]au.uproject(:211-315, correction de doc 29:139-140). ModelContextProtocol, ToolsetRegistry, EditorToolset, MCPClientToolset et Terminal ne sont activés que par dépendance (CSVdep), depuis HyperAIStudio (Editor, § 3.7) et les toolsets (Editor). ModelContextProtocol a pourtant des modulesRuntime(CSV:170), qui restent hors du jeu.
4. Établi / estimé / incertain
Établi (lu à la source) :
- Les trois niveaux par plugin, tableau de
## Constats: montage (JEU, reçus RCT-S/RCT-D), code lié (RSP-S, recompte RSP-D identique : 44/44), contenu (pwsh surSaved\Cooked, UFS-S ; recompte Development identique : 29/29). - Les chaînes de dépendances, lues dans les
.uplugindu moteur 5.8 installé, avec les entrées présentes dansBuildPluginsde RCT-S. - La règle UBT : une entrée Editor du
.uprojectn'empêche pas un plugin d'entrer dans le jeu par dépendance (UBT:5661, 5680, 5840-5844 ; résultat visible dans RCT-S). - RSP-S, RCT-S et l'exe Shipping viennent de la compilation U8-T2 (dates, taille d'exe). Les fichiers cuits HairStrands viennent de la cuisson U8-T3 (dates).
- État 5.8, d'après les descripteurs locaux : Concert bêta (CSV:63-66) ; PythonScriptPlugin bêta (CSV:220) ; Takes, HairStrands, Interchange, InterchangeAssets ni bêta ni expérimentaux (CSV:248, 124, 130, 131) ; famille MCP expérimentale (CSV), confirmé par les notes de version Epic 5.8 (« MCP Server (Experimental) »).
Estimé :
- Les modules Runtime liés sont aussi chargés et démarrés à l'exécution : leur plugin est monté, et IMPLEMENT_MODULE en monolithique les enregistre statiquement. Aucun journal ne liste les démarrages de modules du jeu.
- L'éditeur de liens garde le code de ces modules (enregistrement statique), malgré
/OPT:REF; la part de chacun dans les 164,8 Mo de l'exe n'est pas mesurée. - Le chemin « nouvelle instance » de
AddPluginqui suit les dépendances (UBT:5933-5995) n'a pas été relu ligne à ligne ; son effet est prouvé par RCT-S. PythonScriptPluginPreloadest une coquille vide en jeu : la structureif (Target.bBuildEditor) … else WITH_PYTHON=0est déduite des lignes 16 et 26, non lues en entier.- Les matériaux HairStrands sont cuits à cause des références du CDO de
UGroomComponent(module lié) ; aucun journal de cuisson n'a été lu pour le confirmer.
Incertain (essai qui trancherait) :
- Le jeu utilise-t-il des grooms (HairStrands) ?
Source: 0 occurrence deGroom. Une requête AssetRegistry sur les classesGroomAsset/GroomComponent/GroomBindingAssetdans/Game(par exempleLPDumpAssets, ou l'AssetRegistry.bincuit) trancherait. - Usage d'Interchange ou de glTF en jeu ou par les mods (import ou export à l'exécution) : 0 occurrence dans
Source; le contenu deContent/Moduleset des mods n'a pas été lu. - Chaîne exacte à l'exécution : un lancement du jeu avec
-LogCmds="LogPluginManager Verbose"afficherait les références ignorées (PluginManager.cpp:2427). - État 5.8 de Concert, Takes, Python, HairStrands et Interchange selon Epic : seuls les caractères 0-100 000 des notes de version (357 273) ont été lus ; aucune mention de ces cinq plugins dans cette partie. Il reste à lire les offsets 100 000 et au-delà.
- Coût en octets du code dans l'exe : il faudrait une carte de liens (
/MAP) ou un outil de taille ; non disponible.
5. Points à confirmer (repris par la fiche suivante)
- Avant de couper HairStrands : établir l'absence d'assets groom dans
/Game(incertain ci-dessus). - Avant de couper Interchange et GLTFExporter : établir l'absence d'import ou d'export glTF à l'exécution, y compris par les mods.
- Lire la définition de
TargetRules.ShouldIgnorePluginDependency(appel UBT:5816). Si elle se surcharge dansLifePlay.Target.cs, elle couperait proprement NiagaraSimCaching → Takes, ChaosCaching → Takes ou Niagara → PythonScriptPlugin pour le seul jeu (non lu). DisablePluginsdans le Target.cs n'est pas une voie propre : un plugin deDisablePluginsréactivé par un requérant ne produit qu'un avertissement, ou une erreur selonDisablePluginsConflictWarningLevel(UBT:5911-5919). À vérifier si la SPEC l'envisage.- Après toute correction : recompiler la cible Game, puis relire
BuildPluginsde RCT-S (absence attendue), RSP-S (modules disparus), UFS-S (.uplugindisparu) et les lignesMountingd'un nouveau journal de jeu. - Piège d'outil à reporter dans
lp-paths: Glob a rendu 0 sousSaved\Cooked\Windows(motifsLifePlay/Plugins/**/*etEngine/Plugins/**/…), alors queGet-ChildItemy liste des fichiers. Il a fonctionné sousBinariesetIntermediate. SousSaved, lister par pwsh. - Doc 29 § 9 lu seulement aux lignes 130-149 (HyperAIStudio, toolsets) ; ERR-054 à 056 non relus.
6. Questions pour la SPEC ou l'utilisateur
- Q1 : accepte-t-on de nommer au
.uproject, avecTargetAllowList: ["Editor"], des plugins requérants qui ne sont pas eux-mêmes du périmètre ? ConsoleVariables couperait Concert ×4 ; GLTFExporter et InterchangeAxfAssets couperaient Interchange, InterchangeAssets et HairStrands. Le.uprojectgrossit, mais c'est la seule coupure par descripteur qui marche (§ 3.1). - Q2 : pour HyperAIStudio (ignoré par git localement), accepte-t-on une entrée
.uproject{"Name": "HyperAIStudio", "Enabled": true, "Optional": true, "TargetAllowList": ["Editor"]}? SansOptional, une compilation Editor sur un clone sans le plugin échouerait (« Unable to find plugin », UBT:5884-5886). Les outils de mise en place de HyperAIStudio réécrivent-ils le.uproject(doc 29:139-140 : ils ont déjà touché aux toolsets) ? - Q3 : Takes (6 modules) et PythonScriptPlugin (1 module vide) entrent par Niagara, ControlRig et ChaosCloth, que le jeu garde. Accepte-t-on « garder » (contenu déjà exclu par le lot O1), ou ouvre-t-on la piste
ShouldIgnorePluginDependency(point 3) ? - Q4 :
bDisableEnginePluginsByDefault(absent du.uproject,OBA-T1-INV.mdConstats) réglerait le problème à la racine pour les 123 plugins activés par défaut. C'est un lot à part, hors de cette fiche.
Constats
Tableau par plugin (grille O3). Monté = journal JEU et reçu RCT-S ; code = modules du plugin dans RSP-S ; cuit = fichiers du plugin sous Saved\Cooked\Windows (le paquet contient en plus le .uplugin et les .ini cités en § 3).
| Plugin | Monté en jeu (preuve) | Pourquoi (chaîne, preuve) | Code lié (RSP-S) | Contenu cuit | Service en jeu | État 5.8 | Action proposée | Risque |
|---|---|---|---|---|---|---|---|---|
| ConcertMain, ConcertSyncClient, ConcertSyncCore (+ ConcertSharedSlate) | oui, JEU:89-92 ; RCT-S:4018-4021 | ConsoleVariables (activé par défaut) → les 4 (ConsoleVariables.uplugin:11,18-35) |
0 (modules UncookedOnly) ; le requérant lie ConsoleVariablesEditorRuntime (:787) |
0 | non (aucun code, seulement un .ini) |
bêta | corriger : ConsoleVariables au .uproject en TargetAllowList: ["Editor"] (Q1) |
faible : vérifier qu'aucun préréglage de CVar n'est utilisé en jeu ; gain = 4 descripteurs, 1 .ini, 1 module |
| Takes | oui, JEU:234 ; RCT-S:4165 | NiagaraSimCaching (activé par défaut, :13,30-34) et ChaosCloth/Dataflow → ChaosCaching → Takes (ChaosCaching.uplugin:30-35) |
6 modules Runtime (:1097, 1100, 1102-1105) | 0 (DefaultGame.ini:71) |
non attendu (enregistrement de prises : outil de production) ; 0 référence dans Source |
stable (ni bêta ni expérimental) | garder tant que ChaosCloth/Dataflow restent ; option : couper la seule branche NiagaraSimCaching (Editor), ou ShouldIgnorePluginDependency (point 3, Q3) |
couper ChaosCloth casserait la simulation de tissu : à exclure |
| PythonScriptPlugin | oui, JEU:156 ; RCT-S:4142 | Niagara (activé par défaut, :13,17-21) ; ControlRig → SequencerScripting → Python (SequencerScripting.uplugin:17-21) |
1 : PythonScriptPluginPreload (:1008), WITH_PYTHON=0 (estimé) |
0 (DefaultGame.ini:72) ; aucune DLL Python |
non | bêta | garder (coût quasi nul ; coupure impossible sans retirer Niagara) | nul |
| Interchange | oui, JEU:167 ; RCT-S:4077 | GLTFExporter (activé par défaut) → Interchange (GLTFExporter.uplugin:12,27-36, optionnel mais actif) |
11 modules (16 .obj) + draco.lib |
0 (DefaultGame.ini:59) |
non établi (0 référence dans Source ; mods non lus) |
stable | corriger si Q1 et point 2 : GLTFExporter (et InterchangeAxfAssets) en Editor au .uproject |
moyen : un import/export glTF à l'exécution, s'il existe, disparaît |
| InterchangeAssets | oui, JEU:165 ; RCT-S:4078 | Interchange (Interchange.uplugin:115-118), GLTFExporter (:37-40), InterchangeAxfAssets (InterchangeAxfAssets.uplugin:26) |
1 (:913) | 0 (DefaultGame.ini:60) |
non établi | stable | corriger, avec Interchange (mêmes requérants) | faible si Interchange est coupé |
| HairStrands | oui, JEU:210 ; RCT-S:4070 | GLTFExporter → Interchange → HairStrands (Interchange.uplugin:95-98) ; seul requérant monté |
4 modules Runtime (8 .obj, :836-840, 868-870) |
10 fichiers, 650 122 o (matériaux chargés par GroomComponent.cpp:1499-1502) |
incertain (usage de grooms non établi) | stable | corriger seulement si le point 1 établit « pas de groom » (suit la coupure d'Interchange) ; sinon garder et le nommer en jeu | moyen : des cheveux groom, s'il y en a, ne s'afficheraient plus |
| HyperAIStudio | oui, JEU:237 ; RCT-S:3952, 4072 | plugin du projet, activé par défaut (non nommé au .uproject) ; descripteur mis en paquet par CanContainContent (HyperAIStudio.uplugin:14, UBT:5996-5999) |
0 (25 modules Editor) |
0 (Content = 1 README.md) |
non | outil tiers Fab, 5.8 seulement (doc 29:135-136) | corriger : entrée .uproject Optional + TargetAllowList: ["Editor"] (Q2) |
faible ; vérifier que l'outil ne réécrit pas le .uproject |
| ModelContextProtocol, ToolsetRegistry, EditorToolset, MCPClientToolset, Terminal | non (CSV, JEU, RCT-S : 0) | dépendances de HyperAIStudio (Editor, :427-476) et des toolsets (Editor) |
0 | 0 | non (outils éditeur) | expérimental (notes de version 5.8 « MCP Server (Experimental) ») | garder tel quel (déjà hors jeu) | nul |
| 15 toolsets (AIModuleToolset … UMGToolSet) | non (CSV, RCT-S : 0 ; RCT-E : présents) | nommés au .uproject avec TargetAllowList: ["Editor"] (:211-315, doc 29:139-140) |
0 | 0 | non | expérimental (CSV) | garder tel quel | nul |
Synthèse :
- Sur les 9 plugins du périmètre montés en jeu, aucun n'y est par choix du projet. Tous y sont par la chaîne d'un plugin moteur activé par défaut (ConsoleVariables, GLTFExporter, NiagaraSimCaching, Niagara, ControlRig, ChaosCloth, Dataflow), sauf HyperAIStudio, activé par défaut comme plugin du projet.
- Le
TargetAllowListdu.uprojectne coupe que l'activation directe, jamais une dépendance. - Le lot O1 a déjà neutralisé le contenu (
DirectoriesToNeverCook) de Takes, Python, Interchange et InterchangeAssets. Le seul contenu de plugin cuit dans le périmètre est HairStrands (650 122 o bruts). - Code réellement lié dans l'exe : Takes 6 modules, Interchange 11 (+
draco.lib), InterchangeAssets 1, HairStrands 4, Python 1 (vide). Concert, HyperAIStudio et la famille MCP n'en apportent aucun.
Sources web :
- Unreal Engine 5.8 Release Notes (Epic) : « MCP Server (Experimental) » ; Interchange USD « production ready for asset import and experimental for level import » (partie lue : 0-100 000 caractères).
- FPluginReferenceDescriptor (Epic, API) :
TargetAllowListlimite une référence aux types de cible listés. - Forum Epic « Editor plugin » : UBT filtre les modules Editor à la compilation, un plugin entier n'est retiré que par une référence portant
TargetAllowList; vérification conseillée par.exe.rspetupluginmanifest(constat de forum, recoupé ici par UBT:5840-5844 et RSP-S). - State of Unreal 2026 (Epic) ; DEV Community, Unreal MCP en 5.8 : MCP expérimental, ToolsetRegistry activé automatiquement comme dépendance.