(Feat) Add Animation Fps Charater

This commit is contained in:
2026-08-13 22:07:08 +02:00
parent 176beab9fc
commit cca54a5e0d
157 changed files with 850 additions and 148 deletions
+51 -12
View File
@@ -51,10 +51,13 @@ règles de mort), demander avant de coder plutôt que de deviner.
## Compiler
```powershell
& "C:\Program Files\Epic Games\UE_5.8\Engine\Build\BatchFiles\Build.bat" Survival_projetEditor Win64 Development -Project="d:\Projet\Perso\Unreal\Survival_projet\Survival_projet.uproject" -WaitMutex
& "C:\Program Files\Epic Games\UE_5.8\Engine\Build\BatchFiles\Build.bat" EmberWildEditor Win64 Development -Project="d:\Projet\Perso\Unreal\Survival_projet\EmberWild.uproject" -WaitMutex
```
- Un DLL nommé `UnrealEditor-Survival_projet-000N.dll` signifie que **l'éditeur était ouvert** :
*(Le module et le `.uproject` s'appellent désormais **EmberWild** ; seul le dossier sur le disque
est resté `Survival_projet`.)*
- Un DLL nommé `UnrealEditor-EmberWild-000N.dll` signifie que **l'éditeur était ouvert** :
c'est un hot reload. Prévenir l'auteur de fermer et relancer l'éditeur.
- `-Rebuild` échoue tant que l'éditeur tourne (DLL verrouillés).
- **Ne jamais réécrire en masse les timestamps** des fichiers source pour forcer un build.
@@ -243,7 +246,7 @@ distribué par le dépôt Steam. C'est la procédure de référence.
```powershell
& "C:\Program Files\Epic Games\UE_5.8\Engine\Build\BatchFiles\RunUAT.bat" BuildCookRun `
-project="D:\Projet\Perso\Unreal\Survival_projet\Survival_projet.uproject" `
-project="D:\Projet\Perso\Unreal\Survival_projet\EmberWild.uproject" `
-noP4 -platform=Win64 -clientconfig=Development `
-build -cook -stage -pak -compressed -prereqs `
-archive -archivedirectory="D:\Projet\Perso\Unreal\Survival_projet\Build\Package" `
@@ -254,19 +257,28 @@ distribué par le dépôt Steam. C'est la procédure de référence.
commande `EmberJoin`. Sans eux, un échec chez le testeur ne dit rien. Premier cook ≈ 18 min,
les suivants sont bien plus courts (DDC chaud).
**2. Copier dans le dépôt** — le contenu de `Build\Package\Windows\` va **à la racine** de
`C:\sdk\tools\ContentBuilder\content\`, en excluant `steam_appid.txt` : Steam fournit lui-même
l'AppID au lancement, et le fichier l'écraserait.
**2. Copier et uploader — c'est le MÊME script, il n'y a rien à copier à la main.**
`C:\sdk\tools\ContentBuilder\upload_emberwild.bat` (App **4282850**, dépôt **4282851**) fait les
trois étapes : `rmdir /s /q content` puis `mkdir`, robocopy depuis `Build\Package\Windows`
en `/XF steam_appid.txt`, puis `steamcmd`. Le `.vdf` n'a **pas** de `SetLive`, donc le build monte
sans devenir live ; `upload_emberwild.bat live` utilise l'autre `.vdf` et publie.
**3. Uploader**`C:\sdk\tools\ContentBuilder\upload_emberwild.bat` (App **4282850**, dépôt
**4282851**). Le `.vdf` n'a **pas** de `SetLive`, donc le build monte sans devenir live.
Deux choses à savoir sur ce script :
**4. Publier sur la branche `develop`**, jamais sur `default`. Et vérifier que *Launch Options*
pointe sur `Survival_projet.exe` — puis **publier les changements**, sinon rien n'est visible
- **Il repart d'un `content\` vide à chaque fois, et c'est indispensable** : le staging d'UAT ne
supprime rien, donc un fichier disparu du jeu — ou renommé, comme au passage
`Survival_projet``EmberWild` — resterait dans le dépôt indéfiniment et les testeurs
traîneraient des assets fantômes.
- **Il garde en dur le nom de l'exe** (`EmberWild.exe`) dans ses trois garde-fous : présence du
build, date de l'exe, vérification d'après-copie. Un renommage de projet le casse avec un
« aucun build trouve » trompeur, alors que le build est bien là.
**3. Publier sur la branche `develop`**, jamais sur `default`. Et vérifier que *Launch Options*
pointe sur `EmberWild.exe` — puis **publier les changements**, sinon rien n'est visible
côté client.
**5. Tester à deux** : les deux lancent le jeu **depuis Steam**, l'hôte clique *Jouer*, puis
Échap → *Inviter des amis*. Les logs à lire sont dans `Survival_projet/Saved/Logs/` de chaque
**4. Tester à deux** : les deux lancent le jeu **depuis Steam**, l'hôte clique *Jouer*, puis
Échap → *Inviter des amis*. Les logs à lire sont dans `EmberWild/Saved/Logs/` de chaque
côté — `ShowInviteUI` chez l'hôte, `invitation acceptee` puis `voyage vers [...]` chez l'invité.
**Deux réglages qui cassent tout si on les oublie** : la *List of Maps to Include* dans les
@@ -565,6 +577,33 @@ du joueur dans lui-même.
accidentelle).
- **Clic gauche** = utiliser l'objet actif de la barre. Bindé sur le **pawn**, donc muet quand
l'inventaire est ouvert — le conflit avec le drag & drop se règle tout seul.
- **L'effet du clic gauche part d'un AnimNotify, jamais de l'appui.** Le clic ne fait que lancer
le montage ; c'est `UAnimNotify_ItemAction`, posé dans la timeline au moment de l'impact, qui
appelle `AFpsPlayer::TriggerHeldItemAction()`. Sinon la hache abat l'arbre *avant* de l'avoir
touché — le résultat précède le geste qui aurait dû le produire. L'instant de l'impact
appartient à l'**animation** : un délai en secondes sur le DataAsset serait à re-régler à
chaque animation livrée, et faux dès qu'on touche au Play Rate. Trois points à tenir :
le montage d'usage ne tourne **que sur les bras du joueur local**, donc le notify tombe sur une
seule machine et le routage réseau ne change pas ; un objet **sans `UseMontage` retombe sur
l'effet immédiat** (aucun marqueur ne viendra jamais, le priver d'effet le casserait) ; et la
case visée est **figée à l'appui** (`PendingUseSlotIndex`), la molette pouvant changer d'objet
pendant les trois dixièmes de seconde du geste.
- **Saut des bras FPS : une machine à états, pas des montages.** `JumpStart``JumpFallLoop`
`JumpLanding` / `HardLanding`. Le milieu de la chaîne est une **boucle**, et une boucle ne se
joue pas en montage — c'est ce qui a fait retirer `LandMontage` / `HardLandMontage`, dont le
geste se serait de toute façon superposé à l'état de chute qui venait de démarrer. La sortie de
l'état de chute est pilotée par `ELandingImpact` (`None` / `Soft` / `Hard`), produit par le pawn.
**`Hard` signifie exactement « cette chute a coûté de la vie »** : son seuil est
`FallDamageMinSpeed` et rien d'autre — il n'existe aucun réglage d'animation à côté, qui
finirait par diverger et ferait encaisser le personnage sans qu'il perde un point de vie. Le
seuil bas, lui, reste celui de la secousse de caméra (`LandPunchMinFallSpeed`). Un enum et pas
deux booléens : les trois valeurs mènent aux trois
sorties et s'excluent par construction, donc aucune combinaison ne rend deux transitions valides
en même temps. Il est **remis à `None` dès la première image de vol** (dans `Tick`), ce qui
dispense chaque transition de vérifier `bIsFalling` par-dessus. Deux états de réception distincts
et pas un seul avec un `Blend Poses by bool` : c'est le piège déjà noté pour l'accroupissement,
« Automatic Rule Based on Sequence Player in State » a besoin d'**un** Sequence Player pour lire
sa durée.
- **Objets à charges** (`MaxUses > 1`) ne s'empilent jamais. Les valeurs de restauration
s'appliquent **par utilisation**. L'usure suit l'objet jusqu'au sol et revient avec lui.
- **Mort** : tout tombe au sol autour du corps, respawn au `PlayerStart`, jauges pleines.