(Feat) Add Animation Fps Charater
This commit is contained in:
+51
-12
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user