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).

Créer un playermodel

  1. Créer → Playermodels → Nouveau pack. Un pack de playermodels est un addon local, publiable sur le Workshop, avec un premier playermodel.
  2. 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).
  3. 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.
  4. 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).
  5. Si un membre bouge mal, corrige l'os dans l'onglet Os.
  6. 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.
  7. 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

OngletContenu
ModèleNom 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)
OsPour 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 & skinsLes 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.
BodygroupsTenues au choix : voir Bodygroups.
Visée & IKAperç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 & hitboxCouleurs 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.
Taille et hitboxLa taille en jeu ne change que le dessin. Un géant de 2,5 m avec une hitbox de 1 passe sous les portes comme un joueur normal ; règle l'échelle de la hitbox pour qu'il soit vraiment plus grand.

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+ :

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.

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 JSONRôle
nameNom dans Apparence et dans l'onglet PNJ.
modelFichier du modèle, à côté du JSON.
height, offset, rotationTaille en mètres, décalage [x, y, z] en mètres, rotation [x, y, z] en degrés.
bone_mapOs corrigés à la main : {"os du modèle": "DEF-…"}, "" pour aucun. Les autres os sont reconnus automatiquement.
tint_materialsMaté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_sleeveCouleurs des bras à la première personne ([r, g, b] de 0 à 1).
hitbox_scaleÉchelle de la hitbox, 0,6 à 1,6.
npcProposé 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 / hookRéalitéRôle
GM:PlayerSetModel(ply, id) / hook.Add("PlayerSetModel", …)serveurUn joueur choisit un playermodel dans Apparence (id = "" pour le mannequin). false refuse. Base et Sandbox renvoient true.
ply:SetPlayerModel(id ou nil, skin)serveurImpose 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)serveurChange un bodygroup, sans passer par le hook. Groupes et options comptent à partir de 0, comme dans Garry's Mod.
ply:SetBodyGroups("0120")serveurTous 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)