Em jogos multijogador, os clientes precisam ser sincronizados. É possível trocar pacotes de dados diretamente do seu transporte, mas isso pode ser complexo para desenvolvedores com pouca experiência. Então, vejamos algumas soluções de rede prontas para todos os tipos de casos de uso.
Olá! Sou Dmitrii Ivashchenko, engenheiro-chefe de software da MY.GAMES. Nossa série de artigos sobre o cenário multijogador em tempo real do Unity em 2023 continua! O tópico de hoje diz respeito às soluções prontas para multijogador em tempo real que estão disponíveis para nós. Vamos começar.
Em jogos multijogador, servidores e clientes trocam dados enviando pacotes pela rede. Para criar um espaço virtual compartilhado para jogadores que se conectam de locais diferentes, os eventos no processo do jogo (como movimentos de personagens ou criação de objetos) são sincronizados com outros clientes, enviando-lhes pacotes de dados. A parte responsável pelo envio e recebimento de pacotes pela rede é chamada de camada de transporte.
É teoricamente possível enviar esses pacotes chamando diretamente as funções de envio do seu transporte; essa abordagem pode rapidamente se tornar inconveniente para desenvolvedores que têm pouca experiência em trabalhar com jogos multijogador. Portanto, é melhor usar um dos listados abaixo, em vez de escrever o seu próprio do zero. Vejamos essas soluções.
O Unity oferece dois pacotes Netcode: Netcode for GameObjects (na fase de lançamento de visualização), Netcode for Entities (em modo experimental) e o obsoleto UNET. Ele também fornece o serviço Unity Relay para conectar clientes de jogos – vamos abordar isso agora.
Unity Relay é uma forma de os desenvolvedores de jogos fornecerem conectividade aprimorada entre jogadores por meio de um mecanismo de join code, sem a necessidade de investir em soluções de terceiros, manter servidores de jogos dedicados (DGS) ou se preocupar com complexidades de rede em jogos multijogador. Em vez de utilizar DGS, o serviço Relay fornece conectividade através de um servidor Relay universal, atuando como proxy.
O serviço Relay permite que os jogadores se comuniquem através de vários protocolos diferentes, incluindo UDP, DTLS e WebSocket seguro (WSS). Depois de selecionar um servidor Relay, os clientes se comunicam diretamente com o servidor Relay usando um dos protocolos mencionados acima. As conexões WebSocket permitem conectividade multijogador em navegadores que usam WebGL.
O Relay suporta trabalhar com qualquer mecanismo de jogo. Se você estiver usando o Relay com Unity, é uma prática recomendada usar o Relay SDK, que está integrado ao Unity Transport Package (UTP).
Unity Transport é uma biblioteca de rede de baixo nível para o desenvolvimento de jogos multijogador. Ele sustenta o Netcode for GameObjects e o Netcode for Entities, mas você também pode usá-lo com sua solução.
O Unity Transport oferece suporte sem esforço a todas as plataformas suportadas pelo Unity Engine, graças a uma camada de abstração baseada em conexão (driver de rede integrado) fornecida sobre UDP e WebSockets. Você pode configurar UDP e WebSockets com ou sem criptografia. Você também pode usar pipelines para obter funcionalidades adicionais, como confiabilidade, ordenação de pacotes e fragmentação de pacotes.
Os principais recursos do Transport 2.0 incluem suporte adicional para WebGL; isso permite que o pacote Unity Transport seja usado em todas as plataformas suportadas do Unity Engine. Os usuários de transporte agora têm acesso à nossa implementação de transporte Websocket, com ou sem TLS. Os jogadores em movimento agora podem aproveitar a migração transparente de rede, normalmente entre torres de celular. Este recurso está atualmente limitado ao lado do cliente e ao transporte UDP.
Para trabalhar com o Unity Transport, você precisa instalar o Unity Editor versão 2022.2 ou posterior e também instalar o pacote com.unity.transport
.
O Relay funciona com Unity Transport (UTP), que permite a conexão de clientes que de outra forma não seriam capazes de se comunicar devido a restrições de roteamento, como firewalls rígidos.
O relé tem as seguintes limitações:
Apesar das limitações, o serviço Relay é uma ferramenta poderosa para simplificar a conectividade do jogador e fornecer uma experiência de jogo multijogador tranquila.
Duas das soluções mais populares para o código de rede do jogo principal do Relay incluem Netcode for GameObjects (NGO) e API Mirror Networking.
A prática recomendada é usar ONG (na maioria dos casos) porque ela oferece um conjunto estável de recursos básicos, como variáveis de rede, gerenciamento de cena, chamadas de procedimento remoto (RPCs) e mensagens. No entanto, com a sua simplicidade e facilidade de uso, o API Mirror Networking também é ótimo para jogos que não requerem o conjunto completo de recursos fornecidos pela ONG.
Photon Realtime é a camada central para jogos multijogador (e soluções de rede mais complexas da Photon). Ele lida com problemas como matchmaking de jogadores e comunicação rápida usando uma abordagem escalável. Photon Realtime é usado tanto em jogos quanto em soluções multiplayer mais específicas.
Photon Realtime não inclui mecanismos de sincronização de estado de jogo e simulação como aqueles encontrados nas soluções Fusion ou Quantum, mas se concentra no transporte de mensagens pela rede.
O termo Photon Realtime também abrange nossa extensa estrutura de APIs, ferramentas e serviços, definindo a interação entre clientes e servidores.
Todos os clientes Photon Realtime se conectam a uma sequência de servidores dedicados, divididos em três tarefas distintas: autenticação e distribuição regional (Name Server), correspondência de jogadores (Master Server) e jogabilidade (Game Server). Todos esses servidores são gerenciados por meio da API Realtime, então você não precisa se preocupar com eles – embora conhecê-los certamente possa ser útil.
Photon Cloud é um serviço totalmente gerenciado que fornece hospedagem global para clientes Photon Realtime. O código do jogo se comunica com Photon Cloud, conectando-se à nuvem e usando sua API para realizar ações como conexão, entrar em uma sala aleatória ou gerar eventos.
No Photon Realtime, os dados da sala podem ser facilmente salvos e carregados, e webhooks podem ser configurados para conectar o Photon Cloud a um servidor web externo.
Photon Fusion é uma nova biblioteca de alto desempenho para sincronização de estado de rede para Unity. Ele suporta duas topologias de rede fundamentalmente diferentes e um modo para um jogador sem conexão de rede usando uma única API.
O Fusion foi projetado pensando na simplicidade para integração ao fluxo de trabalho do Unity e oferece recursos avançados, como compactação de dados, previsão do lado do cliente e compensação de atraso "prontos para uso".
No Fusion, por exemplo, o RPC e o estado da rede são definidos por atributos em métodos e propriedades MonoBehaviour
, sem a necessidade de código de serialização explícito, e os objetos de rede podem ser definidos como pré-fabricados, usando todos os recursos pré-fabricados mais recentes do Unity.
O Fusion usa um algoritmo de compactação moderno para reduzir os requisitos de largura de banda com sobrecarga mínima no processador. Os dados são enviados como instantâneos totalmente compactados ou como blocos parciais com consistência subsequente alcançada. Neste último caso, é fornecido um sistema de área de interesse totalmente personalizável, permitindo contagens muito grandes de jogadores.
O Fusion implementa simulação baseada em ticks e opera no modo Compartilhado ou no modo Host. A principal diferença é quem tem autoridade sobre os objetos de rede, mas isso, por sua vez, determina quais outros recursos do SDK estão disponíveis.
O Fusion foi desenvolvido para substituir dois produtos Photon existentes para Unity (Bolt e PUN). Os componentes principais importantes do Fusion são NetworkRunner
e NetworkObject
. NetworkRunner
pode ser considerado o núcleo do Fusion - há um executor na cena que gerencia operações e simulação de rede.
O Fusion oferece vários NetworkBehaviours
pré-construídos para criação rápida de jogos ou protótipos.
O Fusion separa o processamento de entrada em duas etapas: coletar a entrada do hardware local e colocá-la em uma estrutura e, em seguida, ler essa entrada para alterar o estado do jogo (avançando a simulação).
O Fusion oferece suporte a RPC (chamadas de procedimento remoto) para casos em que a entrada padrão do Fusion ou o uso de propriedades [Networked]
não é a solução mais prática. Para começar a usar o Fusion, recomendamos estudar o Guia de primeiros passos do Fusion.
Photon Quantum é um mecanismo totalmente determinístico para jogos multijogador. É baseado na abordagem de previsão/reversão, que é perfeita para jogos online sensíveis a atrasos, como RPGs de ação, jogos de esportes, jogos de luta, FPS e assim por diante.
Ao usar este mecanismo, não há necessidade de netcode; todos os elementos do jogo estão conectados em rede por padrão e 100% sincronizados. Você só precisa criar uma simulação com vários jogadores conectados, como ao desenvolver uma experiência multijogador local. Os subsistemas determinísticos da Quantum garantem que as simulações em cada cliente sejam sempre sincronizadas e sem atrasos, incluindo: física, bots, pathfinding, animação.
Os jogos determinísticos são inerentemente resistentes à trapaça. A luta contra os trapaceiros é realizada através da verificação de replays ou simulações de juízes do servidor (a medida anti-trapaça mais eficaz).
A entrada do jogador é enviada para os servidores Photon Cloud e então distribuída entre os outros jogadores. Webhooks podem ser usados para conectar seu próprio back-end e plug-ins para executar código personalizado no lado do servidor.
Photon Quantum é construído em uma arquitetura ECS, e o alto desempenho é reivindicado para rodar até mesmo jogos multijogador fisicamente intensos em PC, consoles, VR e telefones celulares.
Simulações codificadas em Quantum não dependem do Unity e podem ser executadas em qualquer lugar. Todas as ações locais são executadas sem demora e as entradas remotas são previstas e revertidas. Quantum tem a capacidade de visualizar replays. Os replays podem ser salvos no backend ou usados no jogo. Para começar, você pode conferir a série Quantum 100.
Normcore é uma ferramenta de alto desempenho para adicionar um modo multijogador a qualquer projeto baseado em Unity. Normcore inclui física de rede, espaços persistentes, chat de voz e suporte XR.
Normcore sincroniza automaticamente todas as transformações de objetos quando você adiciona o componente RealtimeTransform
a ele. Isso não requer nenhuma codificação. Além disso, o Normcore oferece interpolação dependente do estado e física de rede confiável para movimento perfeito em qualquer conexão.
Uma das principais vantagens do Normcore é o transporte rápido de dados baseado em WebRTC. Utiliza o tamanho máximo do pacote que não causa fragmentação durante a transmissão, o que agiliza o processo de transferência de dados. Todos os pacotes de dados no Normcore são criptografados por padrão, garantindo a segurança e confidencialidade dos dados do usuário.
Normcore também usa um sistema de atualização delta. Isso significa que ele rastreia todas as alterações desde o envio do último pacote e, quando chegar a hora de enviar um novo pacote, já sabe o que incluir nele. Isso economiza recursos e melhora o desempenho. Os recursos de serialização de dados no Normcore permitem a otimização do uso da CPU. Todo o código de serialização é gerado automaticamente antes da compilação do projeto, garantindo o uso rápido e eficiente dos recursos.
Os servidores Normcore operam em regiões do mundo todo e são conectados por meio de uma rede privada de fibra óptica, que oferece baixa latência. Você pode hospedar o Normcore em seus próprios servidores ou permitir que o Normcore hospede uma cópia privada de nossa infraestrutura em nuvem para você.
Mirror Networking é uma biblioteca de rede de alto nível para Unity, otimizada para facilidade de uso e confiabilidade. Esta biblioteca foi projetada para simplificar o processo de trabalho com conexões de rede, permitindo que os desenvolvedores se concentrem na criação de seus projetos.
Mirror Networking é compatível com mais de uma dúzia de protocolos de baixo nível e evolui e melhora constantemente. Inclui recursos para chamadas de procedimentos remotos e gerenciamento de contexto pela rede e também oferece suporte ao trabalho com física em aplicativos de rede.
A biblioteca oferece mais de uma dúzia de adaptadores de rede integrados e cinco opções de sistemas de gerenciamento de rede, permitindo que os desenvolvedores criem versões personalizadas. Vários exemplos completos de uso também estão incluídos para facilitar o processo de aprendizagem e codificação.
Nakama da Heroic Labs é um popular servidor de jogos de código aberto que permite que você possua toda a sua infraestrutura em um pacote aberto. Nakama inclui todas as APIs de jogos em tempo real necessárias e recursos sociais e competitivos.
Equipado com todos os recursos necessários para o seu jogo, como multijogador em tempo real e funções sociais e competitivas, Nakama permite personalizar todos os aspectos tanto no cliente quanto no servidor usando Go, TypeScript e Lua. Com Nakama, você pode criar jogos competitivos multijogador em tempo real, personalizar algoritmos de matchmaking, adicionar recompensas diárias, criar tabelas de classificação, implementar moedas no jogo e fornecer bate-papo em tempo real.
Fish-Networking é uma biblioteca gratuita e de código aberto para soluções de rede em Unity, desenvolvida por um designer de jogos experiente. Ele oferece um amplo conjunto de recursos que normalmente só estão disponíveis em soluções pagas.
As principais vantagens do Fish-Networking são a otimização de largura de banda e recursos (que pode economizar nos custos do servidor), suporte para um grande número de jogadores (de dezenas a centenas) e recursos integrados como previsão de cliente, compensação de latência, carga do servidor balanceamento e suporte para objetos de rede aninhados.
A tabela a seguir fornece uma visão geral de várias soluções de rede para desenvolvimento de jogos no Unity, comparando-as pelos protocolos usados, topologias suportadas, número máximo de jogadores por sessão, versão mínima suportada do Unity e status atual em meados de 2023.
Solução | Protocolos | Topologias | Máx. jogadores por sessão | Versão mínima do Unity | Status |
---|---|---|---|---|---|
Netcode para entidades | UDP, WebSockets | Unity Relay, P2P, cliente hospedado, DGS | 100 (Limitação do Relé de Unidade) | 2022.3 | 🧪 Experimental |
Código de rede para GameObjects | UDP, WebSockets | Retransmissão (sobre Unity Relay), P2P, cliente hospedado, DGS | 100 (Limitação do Relé de Unidade) | 2021.3 | ℹ️ Pré-lançamento |
Fóton em tempo real | UDP, TCP, HTTP ou WebSockets confiáveis | Relé (sobre Nuvem de Fótons), DGS | 32 | 2018.4 | ✅Pronto para Produção |
Fusão de fótons | TCP, RUDP, WebSockets | Retransmissão (sobre Photon Cloud), P2P, cliente hospedado, DGS | 200 | 2020.3 | ✅Pronto para Produção |
Fóton Quântico | RUDP | Retransmissão (sobre Nuvem de Fótons) | 32 | 2018.4 | ✅Pronto para produção |
Normcore | WebRTC sobre UDP e TCP | Retransmissão (sobre Normcore Cloud) | 100 | 2020 LTS | ✅Pronto para Produção |
Rede espelhada | KCP , WebSockets | Cliente hospedado, DGS, P2P, Relay | 200 | 2020 LTS | ✅Pronto para produção |
Nakama | RUDP | Retransmissão , autoridade , cliente hospedado | Limitado pelo desempenho do servidor | 2018.4 | ✅Pronto para produção |
Rede de pesca | RUDP, WebSockets | Relé, P2P, DGS | 200 | 2019.4 | ✅Pronto para produção |
Fóton trocadilho | UDP, TCP, WebSockets | DGS, Relay, P2P, Cliente hospedado | 32 | 2019.4 | ⚠️ Obsoleto |
Fóton PARAFUSO | UDP, TCP | P2P, DGS | 50 | 2019.4 | ⚠️ Obsoleto |
UNET | TCP, UDP | Cliente hospedado, DGS | Limitado pelo desempenho do servidor | 5.1 | ⚠️ Obsoleto |
A variedade de soluções disponíveis permite aos desenvolvedores escolher uma ferramenta que atenda às suas necessidades específicas. Muitas soluções suportam diferentes tipos de topologias, o que permite adaptá-las aos requisitos específicos de um jogo. Algumas das soluções de rede antigas, como Photon PUN, Photon BOLT e UNET, estão desatualizadas e não são recomendadas para uso em novos projetos, enquanto Netcode for Entities e Netcode for GameObjects ainda estão em fase experimental ou de pré-lançamento, o que também ainda não permite que sejam utilizados para produção.