Le multijoueur a finalement représenté au moins trois fois plus de temps de développement et de problèmes que ce à quoi je m’attendrais en créant Sunderstar sans lui. Même un jeu de tir spatial relativement simple se complique lorsque le client et le serveur ne s’accordent pas sur la position d’un vaisseau ou d’un projectile.
Les problèmes se voyaient dans les actions de base. Attendre les mises à jour du serveur retardait la réponse aux commandes de déplacement. Lors des collisions, les écarts entre client et serveur pouvaient ramener le vaisseau vers une position corrigée. Les mises à jour tardives compliquaient la fluidité des mouvements distants.
Les tirs rencontraient des problèmes semblables. Avec la dispersion des armes, associer un tir local immédiat au projectile du serveur n’était pas fiable. Le corriger vers une ancienne position serveur pouvait le faire bondir en arrière ou sembler changer de vitesse. Les effets d’impact devaient aussi apparaître à temps sans se répéter à l’arrivée de la confirmation du serveur.
J’ai modifié le vaisseau local pour qu’il prédise immédiatement ses mouvements avec les mêmes calculs que le serveur, puis corrige les écarts à la réception des mises à jour. Les autres vaisseaux se déplacent en douceur entre les positions reçues, avec une estimation limitée de leur mouvement lorsque les mises à jour tardent.
Les collisions ont elles aussi besoin de prédiction. Le client calcule désormais la réaction de votre vaisseau face à un astéroïde ou à un autre vaisseau à partir des données de collision du serveur. Seul votre vaisseau est déplacé localement. Les petites corrections de position sont lissées ; les grands changements, comme les téléportations, sont immédiats.
Le projectile visuel adopte désormais la direction du serveur sans bondir en arrière, en conservant une vitesse constante. Les effets d’impact apparaissent localement et leurs équivalents serveur sont supprimés pour qu’un même impact ne clignote pas deux fois. Le serveur décide toujours des touches et des dégâts.
J’ai aussi fait en sorte que l’apparition des projectiles, les éclairs de bouche, le son et la relecture utilisent la même position à l’extrémité du canon. La modification de la prédiction des déplacements a même révélé un bug d’attribution des bots en mode Host qu’il a fallu corriger.
Les vérifications automatisées sont passées et les mesures se sont déjà améliorées dans la simulation réseau de Unity. Il me reste à vérifier ces progrès lors d’une vraie session de jeu sur internet avec un serveur dédié.
Si vous avez travaillé sur du multijoueur, quelle fonctionnalité apparemment simple vous a pris le plus de temps à faire fonctionner correctement ?