Lot 2 du chantier : le corps du lot precedent devient assemblable. Tete,
coiffure, sourcils, barbe et moustache sont montes en leader pose sur le
mesh du Character, et les couleurs sont posees sur des MID.
FCharacterAppearance tient en 11 octets : des INDEX et jamais des chemins
d'assets. Un chemin couterait une chaine a chaque replication, alors qu'un
index tient dans un octet et se VALIDE contre le catalogue -- un client ne
peut donc pas demander un asset arbitraire.
Le corps se monte depuis une LISTE de meshes meme si elle n'a qu'une case.
Le pack livre exprès SKM_BodyA_torso, _arms, _legs_01/02/03 pour qu'une
armure puisse eteindre les segments qu'elle recouvre : le jour venu la case
0 devient SKM_BodyA_empty et les huit segments suivent, sans que ce code
change. Un pointeur unique imposerait de tout reprendre au premier plastron.
Trois pieges rencontres, aucun visible depuis le code :
- Les UFUNCTION(Exec) d'un UActorComponent ne sont JAMAIS appelees. La
chaine de routage (UPlayer::Exec) interroge le monde, le PlayerInput, le
controller, le pawn, le HUD, le GameMode, le CheatManager, le GameState et
le camera manager -- jamais les composants, AActor ne surchargeant pas
ProcessConsoleExec. Et rien ne proteste. D'ou EmberPart / EmberColor /
EmberAppearanceDump posees sur AFpsPlayer, qui delegue.
- L'ordre des slots de materiau varie d'un mesh a l'autre : sur
SKM_HeadA_01 l'Element 0 est celui des YEUX et le 1 celui de la peau. Les
six tetes venant de deux packs, on cherche le slot par son NOM et on ne
pose rien si aucun ne correspond -- ecraser le slot de la peau repeint le
visage entier de la couleur des yeux.
- Un nom de parametre materiau se lit dans le Material INSTANCE, pas dans
les chaines du master : M_Head_Base contient « Skin Base color » mais le
parametre expose s'appelle « Skin ». D'ou des UPROPERTY de catalogue
plutot que des constantes, pour corriger sans recompiler.
Body B reste a remplir dans DA_CharacterParts, avec son ABP_PlayerBody_B et
sans barbes ni moustaches -- le pack n'en livre pas, et une liste vide se
comporte deja comme NoPart.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Coffres : AStorageContainer, un UInventoryComponent configure en conteneur,
affiche comme panneau de WBP_InventoryScreen plutot que dans un ecran a lui.
Deplacement unifie par UInventoryComponent::TransferSlot / TransferAllTo.
Panneau de detail : UItemDetailsWidget, pose DANS WBP_Inventory a droite de la
grille. Icone, nom, separation, description, barre d'usure. Il recoit un couple
(inventaire, index) et s'abonne a OnInventoryChanged, donc une charge consommee
sous le curseur se voit.
Une case ne connait plus sa grille : elle diffuse OnHoverChanged. La barre
rapide s'y abonne aussi et relaie par le PlayerController, seul a posseder a la
fois le HUD et l'ecran. Le panneau efface la case qu'on QUITTE et non lui-meme,
sinon passer de la barre a la grille viderait ce qui vient d'etre affiche.
L'ecran allume et eteint le panneau (SetItemDetailsEnabled) : WBP_Inventory
etant instancie deux fois en mode coffre, une case a cocher par instance serait
un bug qui attend qu'on oublie de la decocher.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Boucle de jeu complète : récolte, inventaire, consommation, stats de survie,
mort et respawn. Gameplay en C++, Blueprints réservés au câblage d'assets.
Assets binaires (.uasset, .umap, textures, audio) suivis via Git LFS.
Binaries/, Intermediate/, Saved/ et DerivedDataCache/ sont ignorés :
régénérés au build, ils pèsent 3 Go pour 1,3 Go de contenu utile.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>