Playermodels
Un playermodel remplace le mannequin par ton propre personnage. Il garde toutes les animations du jeu (marche, saut, armes, emotes, ragdoll), prend la couleur du joueur et se publie sur le Workshop. Les joueurs le choisissent dans Apparence, et les PNJ peuvent aussi le porter.
Choisir son apparence
Configuration → Apparence dans le menu principal, ou Échap → Apparence en partie : la liste montre le mannequin et tous les playermodels des addons activés, avec un aperçu 3D, le choix du skin et une liste par bodygroup (tenues). Le choix est gardé d'une partie à l'autre et envoyé au serveur dès qu'on rejoint une partie (ou tout de suite si on le change en jeu).
- Le jeu fournit aussi 20 playermodels de base (civils, tenues de travail, soldats, SWAT…), en tête de la liste. Tous les joueurs les ont : rien à télécharger. Leur id est
addon:base/playermodels/<nom>.json(par exempleaddon:base/playermodels/swat.jsonpourply:SetPlayerModel). - Tout le monde voit ton playermodel. Un joueur qui ne l'a pas le télécharge depuis le Workshop automatiquement et voit le mannequin en attendant. Un playermodel local jamais publié n'est visible que des joueurs qui ont le même addon.
- Le gamemode peut refuser un playermodel (hook
PlayerSetModel) : le joueur garde alors le mannequin et reçoit un message. Base et Sandbox acceptent tout.
Créer un playermodel
- Créer → Playermodels → Nouveau pack. Un pack de playermodels est un addon local, publiable sur le Workshop, avec un premier playermodel.
- Un pack, plusieurs playermodels : la liste à gauche de l'éditeur montre les playermodels du pack. Nouveau en ajoute un, Dupliquer copie celui sélectionné avec ses réglages (pratique pour une variante), Supprimer le retire (son fichier part à la corbeille à l'enregistrement). Le nom se change dans les réglages ; à son premier enregistrement, un nouvel élément prend un fichier à son nom (
playermodels/soldat.json). - Importer… un personnage en glTF, GLB ou FBX. Un personnage humanoïde avec un squelette (Mixamo, y compris les squelettes numérotés
mixamorig12_…, Unreal, Rigify, Blender, profil humanoïde de Godot) suit les animations du jeu ; il est mis à 1,83 m et posé sur le sol tout seul. Un personnage en T-pose (bras à l'horizontale) est recalé sur la pose du mannequin : ses bras retombent le long du corps. Un modèle sans squelette est porté tel quel, sans animation. Pour Mixamo, télécharge en FBX, pose T-Pose. Un modèle fait à une autre échelle (plus de 2,2 m dans son fichier) suit mal les animations : remets-le à taille humaine dans ton logiciel 3D avant de l'importer. - Regarde l'aperçu : ton personnage (à droite) doit bouger comme le mannequin d'origine (à gauche, case Comparer). Change l'animation de l'aperçu dans la barre du haut (repos, marche, course, sprint, accroupi, arme en main, saut, danse, assis).
- Si un membre bouge mal, corrige l'os dans l'onglet Os.
- Règle les couleurs, les skins, les bras à la première personne et la hitbox, puis Tester : une partie solo démarre avec le playermodel, vu de dos (C change de vue). Quitter la partie ramène dans l'éditeur.
- Photo Workshop pour la miniature, puis Publier….
Dans la vue : clic gauche ou droit + glisser pour tourner, molette pour zoomer, clic molette pour déplacer, F pour recadrer, Ctrl+S pour enregistrer.
Onglets de réglages
| Onglet | Contenu |
|---|---|
| Modèle | Nom dans Apparence, Proposé pour les PNJ, taille en jeu (m), décalage et rotation du modèle (si les pieds flottent ou s'il regarde de travers) |
| Os | Pour chaque os du modèle, l'os du mannequin qu'il suit. Les os reconnus tout seuls sont marqués (auto) ; un choix fait à la main est en couleur ; (aucun) laisse l'os immobile. Il faut au moins 10 os reconnus pour que le modèle soit animé. Tout remettre en automatique oublie les choix faits à la main. |
| Couleurs & skins | Les matériaux cochés prennent la couleur du joueur (multipliée par leur texture : une texture claire donne une couleur vive). Les skins sont des variantes : pour chaque matériau, une autre image (png, jpg, webp). Le choix du skin est dans la barre du haut pour l'aperçu, et dans Apparence pour les joueurs. |
| Bodygroups | Tenues au choix : voir Bodygroups. |
| Visée & IK | Aperçu de l'IK du personnage : curseurs Viser en haut / en bas et Torsion du buste. Avec Arme (barre du haut) sur un fusil, la main gauche se place sur la poignée avant ; les animations Fusil : … montrent la marche en strafe et les demi-tours. Voir IK du personnage. |
| Mains & hitbox | Couleurs de la peau et des manches des bras à la première personne (blanc = inchangé), pour aller avec le personnage. Échelle de la hitbox (0,6 à 1,6) : capsule de collision, hauteur des yeux et accroupi suivent ; Adapter à la taille du personnage la calcule depuis la taille en jeu. |
IK du personnage
Les joueurs et les PNJ (le mannequin comme les playermodels, qui suivent son squelette) utilisent les modificateurs de squelette de Godot 4.6+ :
- Pieds : sous chaque pied, le sol est mesuré ; les hanches descendent si besoin, les jambes se plient (
TwoBoneIK3D, genoux vers l'avant) et les pieds se couchent sur la pente (CopyTransformModifier3D, 35° au plus). - Visée : la colonne se plie vers la visée (
CCDIK3Davec des cônes de limite : peu en bas du dos, plus au torse et au cou), le torse tourne vers elle (CopyTransformModifier3D) et cette torsion se répartit sur les vertèbres (BoneTwistDisperser3D). Sans visée, la posture de l'animation reste telle quelle. - Arme : le bras droit tourne depuis l'épaule pour que le canon pointe exactement là où le personnage vise (haut, bas, torsion), comme les cibles de bras du template.
- Main gauche : sur les armes à deux mains, elle va sur la poignée avant ; sur un pistolet tenu à deux mains, elle suit la main droite (
TwoBoneIK3D, coude vers le bas et l'extérieur), après la visée. - Arme à deux mains en main : le personnage marche en strafe : le corps reste face à la visée et les jambes jouent le pas de la direction (avant, arrière, côtés, diagonales), calé sur la vraie vitesse (pas de glisse). Au-delà de 6 m/s (sprint), il court face au mouvement. À l'arrêt, si la visée s'écarte de plus de 75°, il fait un quart de tour ou un demi-tour sur place, ses pieds suivant le pivot de l'animation.
Bodygroups (tenues)
Comme dans Garry's Mod, un playermodel peut avoir des bodygroups : des groupes (Tête, Torse, Jambes, Accessoires…) qui ont chacun plusieurs options. Le joueur choisit une option par groupe dans Apparence ; son choix est gardé pour chaque playermodel et envoyé au serveur comme le skin.
- Une option montre ses pièces du modèle et cache celles des autres options du groupe. Une option sans pièce (« Aucun ») cache tout le groupe : une tête nue, sans gilet…
- Une option peut aussi changer des textures (une veste rouge ou bleue) : elles passent par-dessus celles du skin.
- Une option peut cacher d'autres pièces du modèle, même hors de son groupe : clé
"hide"du JSON (pas encore dans l'éditeur), par exemple le torse du corps sous une chemise, pour que la peau ne traverse pas le vêtement. - L'option 1 de chaque groupe est celle par défaut. Les pièces qui ne sont dans aucun bodygroup restent toujours visibles.
- Dans le modèle (Blender…), chaque vêtement est une pièce à part, avec un nom (
Casquette,Gilet_Police…), attachée au même squelette que le corps pour suivre les animations.
Dans l'éditeur, onglet Bodygroups : Ajouter un groupe, puis pour chaque option son nom, ses Pièces (liste à cocher des pièces du modèle) et ses Textures (un matériau → une image). Voir montre l'option dans l'aperçu.
Fichiers d'un playermodel
mon_personnage/
├── addon.json
└── playermodels/
├── playermodel.json réglages du premier playermodel (écrits par l'éditeur)
├── soldat.json un autre playermodel du pack
├── personnage.glb modèles importés
└── rouge.png textures des skins
Chaque fichier JSON de playermodels/ est un playermodel. Son id, utilisé partout (Lua, PNJ) : "addon:<clé>/playermodels/<fichier>.json", par exemple "addon:local_mon_personnage/playermodels/soldat.json". La clé est local_<dossier> pour un addon local et ws_<id Workshop> pour un addon téléchargé (voir Structure d'un addon).
| Clé du fichier JSON | Rôle |
|---|---|
name | Nom dans Apparence et dans l'onglet PNJ. |
model | Fichier du modèle, à côté du JSON. |
height, offset, rotation | Taille en mètres, décalage [x, y, z] en mètres, rotation [x, y, z] en degrés. |
bone_map | Os corrigés à la main : {"os du modèle": "DEF-…"}, "" pour aucun. Les autres os sont reconnus automatiquement. |
tint_materials | Matériaux qui prennent la couleur du joueur. |
skins | [{"name": "Rouge", "textures": {"matériau": "rouge.png"}}]. Le skin 0 est le modèle d'origine, le skin 1 le premier de la liste. |
bodygroups | [{"name": "Tête", "options": [{"name": "Casquette", "parts": ["Casquette"], "textures": {}}, {"name": "Aucun", "parts": []}]}]. Une option peut aussi avoir "hide": ["Corps_Torse", …] : des pièces cachées tant qu'elle est choisie, quel que soit leur groupe (le corps sous un vêtement). 32 groupes de 128 options au plus, 512 images par option ou skin. |
hands_skin, hands_sleeve | Couleurs des bras à la première personne ([r, g, b] de 0 à 1). |
hitbox_scale | Échelle de la hitbox, 0,6 à 1,6. |
npc | Proposé dans l'onglet PNJ du menu de spawn. |
PNJ
Dans l'onglet PNJ du menu de spawn, la liste Apparence fait porter un playermodel aux PNJ qu'on fait apparaître (ceux qui ont Proposé pour les PNJ). En Lua, les clés model, skin et bodygroups de npc.Register donnent un playermodel, un skin et une tenue à une classe, et pnj:SetPlayerModel(id, skin) / pnj:SetBodygroup(groupe, option) les changent en jeu. Le PNJ prend sa couleur (color) sur les matériaux teintés. Tous les joueurs voient la même apparence, y compris ceux qui arrivent plus tard (voir Apparence en multijoueur).
Lua
| Fonction / hook | Réalité | Rôle |
|---|---|---|
GM:PlayerSetModel(ply, id) / hook.Add("PlayerSetModel", …) | serveur | Un joueur choisit un playermodel dans Apparence (id = "" pour le mannequin). false refuse. Base et Sandbox renvoient true. |
ply:SetPlayerModel(id ou nil, skin) | serveur | Impose un playermodel (ou un prop) au joueur, sans passer par le hook. skin facultatif (0 = d'origine). Les joueurs qui ne l'ont pas le téléchargent s'il est publié. Tant qu'un modèle est imposé, le choix du joueur dans Apparence est ignoré ; ply:SetPlayerModel(nil) remet le mannequin et lui rend la main (il reprend son choix en rechangeant d'apparence ou à sa prochaine connexion). |
ply:GetPlayerModel(), ply:GetPlayerSkin() | partagé | Id du modèle porté ("" = mannequin) et skin. |
ply:SetBodygroup(groupe, option) | serveur | Change un bodygroup, sans passer par le hook. Groupes et options comptent à partir de 0, comme dans Garry's Mod. |
ply:SetBodyGroups("0120") | serveur | Tous d'un coup : un caractère par groupe (0–9, puis a–f pour 10 à 15). |
ply:GetBodygroup(groupe) | partagé | Option choisie (0 par défaut). |
ply:GetNumBodyGroups(), ply:GetBodygroupCount(groupe), ply:GetBodygroupName(groupe), ply:FindBodygroupByName(nom) | partagé | Nombre de groupes, nombre d'options d'un groupe, nom d'un groupe, numéro d'un groupe d'après son nom (-1 si absent). |
ply:GetBodyGroups() | partagé | Table des groupes : {id, name, num, submodels} (submodels[0] = nom de la première option…). |
-- Serveur : dans ce mode, seuls les admins choisissent leur playermodel,
-- et l'équipe 2 porte toujours celui de la police.
local POLICE = "addon:ws_3141592653/playermodels/playermodel.json"
function GM:PlayerSetModel(ply, id)
return id == "" or ply:IsAdmin()
end
hook.Add("PlayerSpawn", "uniforme", function(ply)
if ply:Team() == 2 then
ply:SetPlayerModel(POLICE, 1)
end
end)