[DB-RS] Synchronisation position client-serveur (multijoueur)

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Krafter
Messages : 65
Inscription : 11 Fév 2017 17:03

[DB-RS] Synchronisation position client-serveur (multijoueur)

Message par Krafter » 27 Mars 2020 12:03

Bonjour à tous ! :)

Je me suis attaqué récemment, pour la première fois à la réalisation d'un jeu multi-joueurs.
Pour ce projet les joueurs ont des rigidbody et se déplacent avec la physique d'Unity, en appliquant des forces.

J'ai aujourd'hui une instance de Unity qui sert de serveur, et une autre instance client qui peut s'y connecter. Les deux communiquent en s'envoyant des paquets UDP. Le serveur possède l'autorité, donc le client envoit les inputs du joueur au serveur, ce dernier applique les forces à une version du joueur coté serveur en se basant sur les inputs, puis renvoit la position du joueur au client. La position du client est ensuite modifiée pour correspondre à la nouvelle position.

Problème : téléporter ainsi le joueur en permanence à la nouvelle position n'est pas fluide, et le mouvement est donc saccadé (même avec du Lerp ou autre). Il me faut donc déplacer le joueur en appliquant des forces, en modifiant sa vélocité. Se pose alors un problème classique en networking : à cause de la latence due au temps de communication entre le serveur et le client, un écart se créer rapidement entre la position du client et sa position sur le serveur. Il me faut donc utiliser des techniques de "Client-side prédiction" d'après ce que j'ai pu voir sur google. Donc j'applique mes forces sur mon joueur coté client, puis sur mon joueur coté serveur, je compare les deux positions et si il y a une certaine différence je corrige le tir (j'amène mon joueur à la position serveur). J'ai mis cela en place mais c'est très moche, j'ai très vite une différence de position et donc mon joueur est sans arrêt "téléporté" à la position réelle du serveur, donc mouvement saccadé de nouveau...

Bref j'espère avoir été le plus clair possible, si certains ont déjà dû faire face à ce genre de problème (Client-Side prediction avec des rigidbody) et peuvent m'apporter leur aide, je suis bloqué là-dessus depuis un moment... ^^

Répondre

Revenir vers « (C#) CSharp »