La physique ragdoll apporte du punch et du dynamisme aux scènes d'action sur Roblox. Cependant, un système mal calibré provoque des saccades réseau et des personnages éjectés hors de la carte.
Une architecture de production repose sur des contraintes angulaires précises via BallSocketConstraints, l'élimination des collisions mutuelles avec NoCollisionConstraints et une gestion rigoureuse de la NetworkOwnership.
1. Bascule Motor6D et Limites de BallSocketConstraint
Remplacement en temps réel des articulations rigides animées par des liaisons physiques :
- Désactivation des Motor6D : Réglez Motor6D.Enabled = false sans détruire l'instance afin de permettre au personnage de se relever.
- Limites Angulaires : Activez LimitsEnabled et TwistLimitsEnabled pour respecter les amplitudes de mouvement anatomiques.
- Préparation des Attachments : Générez les paires Attachment0 et Attachment1 dès l'apparition du personnage pour éviter les microsaccades.
- Machine d'États : Passez en état Enum.HumanoidStateType.Physics et désactivez GettingUp pendant la chute.
2. Groupes de Collision et NoCollisionConstraints
Éviter les explosions physiques dues au chevauchement des membres :
- Explosions d'Autocollision : Les membres qui se superposent génèrent des forces répulsives projetant le personnage en l'air.
- Emploi de NoCollisionConstraints : Reliez les membres voisins pour désactiver les calculs d'impact mutuels.
- CollisionFilteringService : Isolez les parties ragdoll dans un groupe qui n'interagit qu'avec le décor statique.
- CanCollide : Désactivez CanCollide sur HumanoidRootPart et maintenez-le actif sur le Torso pour rouler sans accrochage.
--!strict
-- Gestionnaire Luau de Ragdoll avec relevage
local PhysicsService = game:GetService("PhysicsService")
3. Network Ownership et Réplication
La répartition du calcul physique détermine la fluidité visuelle :
- Joueur Actif : Attribuez `SetNetworkOwner(player)` pour que le client simule le ragdoll sans latence réseau.
- PNJ et Cadavres : Utilisez `SetNetworkOwner(nil)` pour que le serveur gère la physique de manière déterministe.
- Économie de Bande Passante : Mettez en veille (sleep) les membres immobiles pour préserver les paquets réseau.
- Protection Téléportation : Ne changez pas de propriétaire dans la même frame que la désactivation des Motor6D.
4. Animation de Relevage et Rétablissement
Comment se relever d'une chute sans saut brutal de caméra :
- Alignement au Sol : Effectuez un raycast depuis le torse pour adapter l'orientation du HumanoidRootPart au terrain.
- Suppression du Snap : Recalez le HumanoidRootPart sur le torse avant de réactiver les Motor6D.
- Transition Animée : Jouez une animation de redressement pendant la réactivation progressive des articulations.
- Période d'Invulnérabilité : Accordez une brève immunité pour éviter les boucles d'éjection infinies.
5. Bonnes Pratiques et Optimisation Mobile
Règles essentielles pour préserver le processeur des téléphones :
- Nombre Limité de Liaisons : Restreignez les BallSockets aux articulations principales ; les accessoires restent rigides.
- Mise en Sommeil : Laissez le moteur physique endormir automatiquement les corps ragdoll au sol.
- Nettoyage Mémoire : Supprimez contraintes et attachments 10 secondes après la mort du personnage.
- Audit MicroProfiler : Vérifiez avec Ctrl+F6 que `physics::step` reste inférieur à 3 ms par image.
Frequently Asked Questions
Pourquoi mon ragdoll est-il propulsé dans le ciel ?
En raison d'autocollisions internes. Liez les pièces voisines avec des NoCollisionConstraints et désactivez CanCollide sur HumanoidRootPart.
Où la physique doit-elle être calculée ?
Sur le client pour le joueur actif (`SetNetworkOwner(player)`) et sur le serveur pour les cadavres ou PNJ (`SetNetworkOwner(nil)`).
Comment éviter que le personnage ne se téléporte à son point de chute ?
Réalignez le HumanoidRootPart sur les coordonnées du Torso immédiatement avant de réactiver les Motor6D.
Pourquoi TwistLimits est-il indispensable ?
Il empêche les membres de tourner à 360 degrés sur leur axe comme un tire-bouchon, préservant ainsi l'anatomie humaine.