Dans les jeux multijoueurs, les clients doivent être synchronisés. Il est possible d'échanger des paquets de données directement depuis votre transport, mais cela peut être complexe pour les développeurs peu expérimentés. Examinons donc quelques solutions de mise en réseau prêtes à l'emploi pour toutes sortes de cas d'utilisation.
Bonjour! Je m'appelle Dmitrii Ivashchenko, ingénieur logiciel principal chez MY.GAMES. Notre série d'articles sur le paysage multijoueur en temps réel d'Unity en 2023 se poursuit ! Le sujet d'aujourd'hui concerne les solutions toutes faites pour le multijoueur en temps réel qui sont disponibles pour nous. Commençons.
Dans les jeux multijoueurs, les serveurs et les clients échangent des données en envoyant des paquets sur le réseau. Afin de créer un espace virtuel partagé pour les joueurs qui se connectent depuis différents endroits, les événements du processus de jeu (comme les mouvements des personnages ou la création d'objets) sont synchronisés avec d'autres clients en leur envoyant des paquets de données. La partie responsable de l’envoi et de la réception des paquets sur le réseau est appelée couche transport.
Il est théoriquement possible d'envoyer ces paquets en appelant directement les fonctions d'envoi de votre transport, cette approche peut vite devenir gênante pour les développeurs peu expérimentés dans les jeux multijoueurs. C'est donc une meilleure idée d'utiliser l'un de ceux répertoriés ci-dessous, au lieu d'écrire le vôtre à partir de zéro. Examinons ces solutions.
Unity propose deux packages Netcode : Netcode pour GameObjects (en phase de version préliminaire), Netcode pour les entités (en mode expérimental) et UNET, obsolète. Il fournit également le service Unity Relay pour connecter les clients du jeu – parlons-en maintenant.
Unity Relay est un moyen pour les développeurs de jeux de fournir une connectivité améliorée entre les joueurs via un mécanisme de code de jointure, sans avoir besoin d'investir dans des solutions tierces, de maintenir des serveurs de jeu dédiés (DGS) ou de se soucier de la complexité du réseau dans les jeux multijoueurs. Au lieu d'utiliser DGS, le service Relay fournit une connectivité via un serveur Relay universel, agissant comme proxy.
Le service Relay permet aux joueurs de communiquer via plusieurs protocoles différents, notamment UDP, DTLS et WebSocket sécurisé (WSS). Après avoir sélectionné un serveur Relay, les clients communiquent directement avec le serveur Relay en utilisant l'un des protocoles susmentionnés. Les connexions WebSocket permettent une connectivité multijoueur dans les navigateurs utilisant WebGL.
Relay prend en charge le fonctionnement avec n'importe quel moteur de jeu. Si vous utilisez Relay avec Unity, il est recommandé d'utiliser le SDK Relay, qui est intégré à Unity Transport Package (UTP).
Unity Transport est une bibliothèque réseau de bas niveau pour développer des jeux multijoueurs. Il sous-tend Netcode for GameObjects et Netcode for Entities, mais vous pouvez également l'utiliser avec votre solution.
Unity Transport prend en charge sans effort toutes les plates-formes prises en charge par Unity Engine, grâce à une couche d'abstraction basée sur la connexion (pilote réseau intégré) fournie en plus d'UDP et de WebSockets. Vous pouvez configurer UDP et WebSockets avec ou sans cryptage. Vous pouvez également utiliser des pipelines pour obtenir des fonctionnalités supplémentaires telles que la fiabilité, l'ordre des paquets et la fragmentation des paquets.
Les principales fonctionnalités de Transport 2.0 incluent la prise en charge supplémentaire de WebGL ; cela permet au package Unity Transport d'être utilisé sur toutes les plates-formes prises en charge par Unity Engine. Les utilisateurs de transport ont désormais accès à notre implémentation de transport Websocket, avec ou sans TLS. Les joueurs en déplacement peuvent désormais profiter d’une migration transparente du réseau, généralement entre les tours cellulaires. Cette fonctionnalité est actuellement limitée au côté client et au transport UDP.
Pour travailler avec Unity Transport, vous devez installer Unity Editor version 2022.2 ou ultérieure et également installer le package com.unity.transport
.
Relay fonctionne avec Unity Transport (UTP), qui permet à des clients de se connecter qui, autrement, ne pourraient pas communiquer en raison de restrictions de routage, telles que des pare-feu stricts.
Le relais présente les limitations suivantes :
Malgré ses limitations, le service Relay est un outil puissant pour simplifier la connectivité des joueurs et offrir une expérience de jeu multijoueur fluide.
Deux des solutions les plus populaires pour le code du réseau de jeu principal de Relay incluent Netcode for GameObjects (NGO) et API Mirror Networking.
La meilleure pratique recommandée consiste à utiliser NGO (dans la plupart des cas) car il offre un ensemble stable de fonctionnalités de base telles que les variables réseau, la gestion de scènes, les appels de procédure à distance (RPC) et la messagerie. Cependant, grâce à sa simplicité et sa facilité d'utilisation, API Mirror Networking est également idéal pour les jeux qui ne nécessitent pas l'ensemble complet de fonctionnalités fournies par ONG.
Photon Realtime est la couche principale des jeux multijoueurs (et des solutions réseau plus complexes de Photon). Il traite des problèmes tels que la mise en relation des joueurs et la communication rapide en utilisant une approche évolutive. Photon Realtime est utilisé aussi bien dans les jeux que dans des solutions multijoueurs plus spécifiques.
Photon Realtime n'inclut pas de mécanismes de synchronisation de l'état du jeu et de simulation comme ceux trouvés dans les solutions Fusion ou Quantum, mais se concentre plutôt sur le transport des messages sur le réseau.
Le terme Photon Realtime englobe également notre vaste cadre d'API, d'outils et de services, définissant l'interaction entre les clients et les serveurs.
Tous les clients Photon Realtime se connectent à une séquence de serveurs dédiés, divisés en trois tâches distinctes : authentification et distribution régionale (Name Server), correspondance de joueurs (Master Server) et gameplay (Game Server). Tous ces serveurs sont gérés via l'API Realtime, vous n'avez donc pas à vous en soucier, même si les connaître peut certainement être utile.
Photon Cloud est un service entièrement géré qui fournit un hébergement mondial aux clients Photon Realtime. Le code du jeu communique avec Photon Cloud, se connecte au cloud et utilise son API pour effectuer des actions telles que la connexion, rejoindre une salle aléatoire ou déclencher des événements.
Dans Photon Realtime, les données de la salle peuvent être facilement enregistrées et chargées, et des webhooks peuvent être configurés pour connecter Photon Cloud à un serveur Web externe.
Photon Fusion est une nouvelle bibliothèque hautes performances pour la synchronisation de l'état du réseau pour Unity. Il prend en charge deux topologies de réseau fondamentalement différentes et un mode pour un joueur sans connexion réseau utilisant une seule API.
Fusion est conçu dans un souci de simplicité pour l'intégration dans le flux de travail Unity et offre des fonctionnalités avancées telles que la compression des données, la prédiction côté client et la compensation des retards « prêtes à l'emploi ».
Dans Fusion, par exemple, le RPC et l'état du réseau sont définis par des attributs sur les méthodes et propriétés MonoBehaviour
, sans avoir besoin de code de sérialisation explicite, et les objets réseau peuvent être définis comme des préfabriqués, en utilisant toutes les dernières fonctionnalités préfabriquées d'Unity.
Fusion utilise un algorithme de compression moderne pour réduire les besoins en bande passante avec une surcharge minimale sur le processeur. Les données sont envoyées soit sous forme d'instantanés entièrement compressés, soit sous forme de blocs partiels avec une cohérence ultérieure obtenue. Dans ce dernier cas, un système de zones d'intérêt entièrement personnalisable est fourni, permettant un très grand nombre de joueurs.
Fusion implémente une simulation basée sur les ticks et fonctionne soit en mode partagé, soit en mode hôte. La principale différence réside dans la question de savoir qui a l'autorité sur les objets réseau, mais cela détermine à son tour quelles autres fonctionnalités du SDK sont disponibles.
Fusion a été développé pour remplacer deux produits Photon existants pour Unity (Bolt et PUN). Les composants de base importants de Fusion sont NetworkRunner
et NetworkObject
. NetworkRunner
peut être considéré comme le cœur de Fusion : il y a un runner dans la scène qui gère les opérations et la simulation du réseau.
Fusion propose divers NetworkBehaviours
prédéfinis pour la création rapide de jeux ou de prototypes.
Fusion divise le traitement des entrées en deux étapes : collecter les entrées du matériel local et les placer dans une structure, puis lire ces entrées pour modifier l'état du jeu (faire progresser la simulation).
Fusion prend en charge RPC (Remote Procedure Calls) dans les cas où la saisie standard de Fusion ou l'utilisation des propriétés [Networked]
n'est pas la solution la plus pratique. Pour démarrer avec Fusion, nous vous recommandons d'étudier le Guide de démarrage de Fusion.
Photon Quantum est un moteur entièrement déterministe pour les jeux multijoueurs. Il est basé sur l'approche prédiction/rollback, parfaite pour les jeux en ligne sensibles aux délais, comme les RPG d'action, les jeux de sport, les jeux de combat, les FPS, etc.
Lors de l’utilisation de ce moteur, aucun netcode n’est nécessaire ; tous les éléments du jeu sont mis en réseau par défaut et synchronisés à 100 %. Il vous suffit de créer une simulation avec plusieurs joueurs connectés, comme lors du développement d'une expérience multijoueur locale. Les sous-systèmes déterministes de Quantum garantissent que les simulations sur chaque client sont toujours synchronisées et sans retard, y compris : physique, robots, recherche de chemin, animation.
Les jeux déterministes sont intrinsèquement résistants à la triche. La lutte contre les tricheurs s'effectue par la vérification des replays ou des simulations serveur-juge (la mesure anti-triche la plus efficace).
Les entrées des joueurs sont envoyées aux serveurs Photon Cloud et sont ensuite distribuées entre les autres joueurs. Les webhooks peuvent être utilisés pour connecter votre propre backend et vos plugins afin d'exécuter du code personnalisé côté serveur.
Photon Quantum est construit sur une architecture ECS et des performances élevées sont revendiquées pour exécuter des jeux multijoueurs physiquement intensifs sur PC, consoles, VR et téléphones mobiles.
Les simulations codées dans Quantum n'ont aucune dépendance sur Unity et peuvent s'exécuter n'importe où. Toutes les actions locales sont exécutées sans délai et les entrées distantes sont prédites et annulées. Quantum a la possibilité de visualiser les rediffusions. Les rediffusions peuvent être enregistrées sur le backend ou utilisées dans le jeu. Pour commencer, vous pouvez consulter la série Quantum 100.
Normcore est un outil performant permettant d'ajouter un mode multijoueur à tout projet basé sur Unity. Normcore inclut la physique des réseaux, les espaces persistants, le chat vocal et la prise en charge XR.
Normcore synchronise automatiquement toutes les transformations d'objets lorsque vous y ajoutez le composant RealtimeTransform
. Cela ne nécessite aucun codage. De plus, Normcore offre une interpolation dépendante de l'état et une physique de réseau fiable pour un mouvement parfait dans n'importe quelle connexion.
L'un des principaux avantages de Normcore est son transport rapide de données basé sur WebRTC. Il utilise la taille maximale des paquets qui ne provoque pas de fragmentation pendant la transmission, ce qui accélère le processus de transfert de données. Tous les paquets de données dans Normcore sont cryptés par défaut, garantissant la sécurité et la confidentialité des données utilisateur.
Normcore utilise également un système de mise à jour delta. Cela signifie qu'il suit toutes les modifications depuis l'envoi du dernier paquet, et lorsqu'il est temps d'envoyer un nouveau paquet, il sait déjà quoi y inclure. Cela économise des ressources et améliore les performances. Les fonctionnalités de sérialisation des données de Normcore permettent d'optimiser l'utilisation du processeur. Tout le code de sérialisation est automatiquement généré avant la compilation du projet, garantissant une utilisation rapide et efficace des ressources.
Les serveurs Normcore fonctionnent dans les régions du monde entier et sont connectés via un réseau de fibre optique privé, qui offre une faible latence. Vous pouvez héberger Normcore sur vos propres serveurs ou autoriser Normcore à héberger une copie privée de notre infrastructure cloud pour vous.
Mirror Networking est une bibliothèque réseau de haut niveau pour Unity, optimisée pour la facilité d'utilisation et la fiabilité. Cette bibliothèque est conçue pour simplifier le processus de travail avec les connexions réseau, permettant aux développeurs de se concentrer sur la création de leurs projets.
Mirror Networking est compatible avec plus d’une douzaine de protocoles de bas niveau et évolue et s’améliore constamment. Il comprend des fonctionnalités pour les appels de procédures à distance et la gestion du contexte sur le réseau et prend également en charge l'utilisation de la physique dans les applications en réseau.
La bibliothèque propose plus d'une douzaine d'adaptateurs réseau intégrés et cinq options de système de gestion de réseau, permettant aux développeurs de créer des versions personnalisées. Plusieurs exemples d'utilisation complets sont également inclus pour faciliter le processus d'apprentissage et de codage.
Nakama de Heroic Labs est un serveur de jeu open source populaire qui vous permet de posséder l'intégralité de votre infrastructure dans un seul package ouvert. Nakama comprend toutes les API de jeu en temps réel nécessaires ainsi que des fonctionnalités sociales et compétitives.
Equipé de toutes les fonctionnalités nécessaires à votre jeu, telles que le multijoueur en temps réel et les fonctions sociales et compétitives, Nakama vous permet de personnaliser tous les aspects tant côté client que côté serveur à l'aide de Go, TypeScript et Lua. Avec Nakama, vous pouvez créer des jeux compétitifs multijoueurs en temps réel, personnaliser les algorithmes de mise en relation, ajouter des récompenses quotidiennes, créer des classements, implémenter des devises dans le jeu et proposer un chat en temps réel.
Fish-Networking est une bibliothèque gratuite et open source pour les solutions de mise en réseau dans Unity, développée par un concepteur de jeux expérimenté. Il offre un ensemble complet de fonctionnalités qui ne sont généralement disponibles qu’avec les solutions payantes.
Les principaux avantages de Fish-Networking sont l'optimisation de la bande passante et des ressources (qui permet d'économiser sur les coûts du serveur), la prise en charge d'un grand nombre de joueurs (de dizaines à des centaines) et des fonctionnalités intégrées telles que la prédiction du client, la compensation de latence, la charge du serveur. l'équilibrage et la prise en charge des objets réseau imbriqués.
Le tableau suivant donne un aperçu des différentes solutions réseau pour le développement de jeux sur Unity, en les comparant selon les protocoles utilisés, les topologies prises en charge, le nombre maximum de joueurs par session, la version minimale prise en charge de Unity et l'état actuel à la mi-2023.
Solution | Protocoles | Topologies | Max. joueurs par session | Version minimale d'Unity | Statut |
---|---|---|---|---|---|
Netcode pour les entités | UDP, WebSockets | Unity Relay, P2P, Client hébergé, DGS | 100 (Limitation du relais Unity) | 2022.3 | 🧪 Expérimental |
Netcode pour GameObjects | UDP, WebSockets | Relay (sur Unity Relay), P2P, Client hébergé, DGS | 100 (Limitation du relais Unity) | 2021.3 | ℹ️ Pré-version |
Photons en temps réel | UDP, TCP, HTTP ou WebSockets fiables | Relais (sur Photon Cloud), DGS | 32 | 2018.4 | ✅ Prêt pour la production |
Fusion de photons | TCP, RUDP, WebSockets | Relay (sur Photon Cloud), P2P, Client hébergé, DGS | 200 | 2020.3 | ✅ Prêt pour la production |
Photons Quantiques | RUDP | Relais (sur Photon Cloud) | 32 | 2018.4 | ✅ Prêt pour la production |
Normcore | WebRTC sur UDP et TCP | Relais (sur Normcore Cloud) | 100 | 2020 LTS | ✅ Prêt pour la production |
Mise en réseau miroir | KCP , WebSockets | Hébergé client, DGS, P2P, Relay | 200 | 2020 LTS | ✅ Prêt pour la production |
Nakama | RUDP | Relais , faisant autorité , hébergé par le client | Limité par les performances du serveur | 2018.4 | ✅ Prêt pour la production |
Filet de pêche | RUDP, WebSockets | Relais, P2P, DGS | 200 | 2019.4 | ✅ Prêt pour la production |
Photon PUN | UDP, TCP, WebSockets | DGS, Relais, P2P, Client hébergé | 32 | 2019.4 | ⚠️ Obsolète |
BOULON À Photons | UDP, TCP | P2P, DGS | 50 | 2019.4 | ⚠️ Obsolète |
UNET | TCP, UDP | Client hébergé, DGS | Limité par les performances du serveur | 5.1 | ⚠️ Obsolète |
La variété des solutions disponibles permet aux développeurs de choisir un outil adapté à leurs besoins spécifiques. De nombreuses solutions prennent en charge différents types de topologies, ce qui permet de les adapter aux exigences spécifiques d'un jeu. Certaines des anciennes solutions réseau, telles que Photon PUN, Photon BOLT et UNET, sont obsolètes et ne sont pas recommandées pour une utilisation dans de nouveaux projets, tandis que Netcode for Entities et Netcode for GameObjects sont encore au stade expérimental ou de pré-version, ce qui également ne permet pas encore leur utilisation pour la production.