Construindo meu primeiro jogo multiplayer com Netcode for GameObjects

Meu nome é Esteban Maldonado e sou um defensor de desenvolvedores da Unity. Meu trabalho é divulgar o Unity Gaming Services e criar novo material educacional para que os desenvolvedores possam começar a usar as ferramentas em sua própria jornada de desenvolvimento multiplayer.
Uma das soluções é Netcode for GameObjects (NGO), uma biblioteca de rede de nível médio de primeira parte construída para o motor de jogo Unity. Uma solução de netcode é essencial em qualquer projeto de desenvolvimento multiplayer.
Uma das responsabilidades de um defensor de desenvolvedores na Unity é criar jogos de exemplo que mostrem nossas ferramentas, e um exemplo de NGO foi atribuído a mim – Galactic Kittens.
No entanto, embora eu tenha tido minha boa parte de trabalhos profissionais na indústria de jogos, pessoalmente tenho pouca experiência em fazer jogos multiplayer – então isso iria se provar não apenas uma oportunidade de aprendizado para os desenvolvedores que usam o exemplo, mas também uma experiência de aprendizado para mim ao fazer o jogo em primeiro lugar.
Juntamente com minha equipe, desenvolvemos o conceito de Galactic Kittens – o nível de dificuldade do exemplo, as mecânicas básicas, as habilidades dos personagens (que foram posteriormente removidas) e mais.
Para enfrentar este projeto de jogo de exemplo, juntei forças com a talentosa equipe da Bromio para dar vida a este jogo de exemplo com ativos artísticos polidos, música e SFX, e suporte de programação. Nosso objetivo combinado era fornecer aos desenvolvedores uma introdução simples e amigável ao desenvolvimento de um jogo multiplayer na Unity com Netcode for GameObjects.
Neste blog, vou cobrir a jornada de desenvolvimento de Galactic Kittens, do protótipo ao lançamento estável, e como você pode aproveitar este exemplo para iniciar seu próprio projeto multiplayer.
Antes de mergulhar em seu desenvolvimento, aqui está uma visão rápida do nosso novo jogo de exemplo Galactic Kittens. Este exemplo é uma aventura espacial cooperativa 2D projetada para ajudá-lo a aprender alguns conceitos básicos de rede multiplayer.
O exemplo é destinado a ensinar técnicas necessárias para começar com o desenvolvimento multiplayer, como:
- Gerenciamento de sessão de rede, com troca automática de cena
- Sincronização básica de movimento 2D, incluindo mudanças em folhas de sprites
- Gerar objetos de jogo em tempo de execução, no lado do servidor
- Transferindo a propriedade dos jogadores principais do servidor para seu cliente
- Criação de VFX em todos os clientes conectados
- Como reproduzir efeitos sonoros e música para todos os clientes
- Comunicando estatísticas de jogadores e do jogo (saúde, inimigos derrotados, etc.) e exibindo-as na interface do usuário do jogo
Você pode saber mais sobre Galactic Kittens em nosso site, ou baixar o exemplo diretamente do GitHub para começar a explorar o código.
Embora eu não tivesse muita experiência em fazer jogos multiplayer, a Unity tem muitos recursos públicos para ajudar os usuários a começarem a usar o NGO.
Com esses recursos, comecei de forma muito simples, familiarizando-me com conceitos e terminologia de rede básicos, usando nossa documentação de Unity Multiplayer. Em seguida, segui os tutoriais do projeto Olá Mundo e estudei amostras pequenas disponíveis para começar a obter alguns resultados.
Após algumas tentativas e erros, consegui fazer um protótipo básico simples do zero.

Neste ponto, não havia lobby personalizado, nenhuma interface real, nenhum gerenciamento de conexão real – você entendeu a ideia. O protótipo consistia apenas em duas naves iguais (com três Pontos de Vida cada) que se moviam pela tela e disparavam uma bala cúbica quando você pressionava a barra de espaço. Era o suficiente para mostrar a geração de objetos e a sincronização de movimento entre os clientes.
Foi um começo, mas eu sabia que o Bromio nos ajudaria a chegar à linha de chegada e transformar isso em um exemplo funcional.
Após meu progresso inicial, comecei a trabalhar com o Bromio para desenvolver o protótipo em algo mais pronto para produção. Assim como eu, eles não tinham muita experiência em fazer jogos multiplayer, mas aceitaram o desafio e nos ajudaram a alcançar nosso objetivo.
Para trabalhar de forma mais eficiente, dividimos o jogo em componentes isolados para começar o desenvolvimento em paralelo – com artistas trabalhando em ativos e programadores trabalhando na lógica central do jogo.
Aqui está um vislumbre da evolução do estilo artístico em Galactic Kittens.
Enquanto isso, o principal desenvolvedor do Bromio e eu estávamos descobrindo aspectos divertidos e desafiadores de transformar Galactic Kittens em um exemplo de jogo funcional.
Um dos maiores desafios no desenvolvimento foi o gerenciamento de conexão e a seleção de personagens. Tivemos que armazenar os dados dos personagens em arquivos separados ScriptableObject, que você verá quando baixar o projeto.
Esses arquivos contêm as informações necessárias sobre cada explorador espacial, incluindo quais sprites (jogador e nave) mostrar na interface do usuário e os prefabs que devem ser gerados para cada jogador assim que a cena de jogo começar.
Na tela de seleção de personagens, um grande desafio foi garantir que o evento de desconexão de um cliente fosse reconhecido e lidar com esse evento através da interface do usuário.
Decidimos que os usuários não deveriam poder escolher o mesmo personagem, a fim de mostrar como os desenvolvedores poderiam realmente fazer isso em seus próprios jogos. (Na verdade, é mais fácil deixar os jogadores escolherem o mesmo personagem, já que não há restrição adicional.)

O próximo desafio para o gerenciamento de conexão foi o evento de desconexão de jogadores no meio de uma sessão de jogo. Isso significava que o jogo não apenas tinha que se adaptar aos jogadores que saíam, mas também tinha que bloquear outros jogadores de entrarem enquanto um jogo está em sessão. Decidimos fazer com que o gerenciador de conexão permitisse novas conexões apenas enquanto a instância do host está na tela de seleção de personagens. Esta não é uma solução única para todos – outros jogos podem permitir que jogadores entrem tarde em uma sessão em andamento, enquanto outros jogos podem não permitir – cabe aos desenvolvedores decidir o que é melhor para sua experiência.
Queríamos manter a jogabilidade simples, sem IA complexa ou lógica de comportamento elaborada para os inimigos ou meteoritos que os jogadores veem. Dessa forma, poderíamos fornecer um exemplo de jogo completo sem tirar o foco de mostrar aos usuários como usar a biblioteca NGO.
Assim, existem dois tipos principais de inimigos e um obstáculo de meteorito:
Meteorito Space Shooter Space Ghost
Ambos os inimigos escolhem um padrão de movimento aleatório, enquanto o inimigo Space Shooter é o único que realmente atira lasers de volta. Por favor, consulte nossoguia do desenvolvedor para mais informações sobre como esses inimigos são construídos e como você pode adicionar sua própria lógica.
Quando trabalhamos na batalha contra o chefe, todas as lições aprendidas com a implementação do lobby do jogo, o comportamento da nave do jogador e os inimigos simples nos ajudaram a construir rapidamente a experiência final da batalha contra o chefe.
Um desafio particular foi cronometrar o alarme de aviso que você ouve e vê antes do chefe entrar. No final, enviamos eventos com RPCs de cliente e servidor para sinalizar que a experiência de jogo regular havia terminado e a batalha final contra o chefe estava prestes a começar.

O comportamento do chefe é estruturado como uma máquina de estados finitos (FSM) que seleciona aleatoriamente qual conjunto de ataques lançar nos jogadores conectados. Para fazer isso, usamos uma classe C# chamada BossController, que gerencia a transição de um estado de chefe para outro. Verifique o guia do desenvolvedor para informações sobre o código por trás desta batalha e como você pode adicionar seus próprios estados de chefe.
O recurso número 1 que nos ajudou a ter sucesso em nossa missão de construir este jogo de amostra foi entrar no servidor Discord de Networking Multiplayer da Unity e fazer perguntas à comunidade. Aqui, conseguimos realmente conversar com outros desenvolvedores que estão criando jogos multiplayer e também conversar com os criadores do serviço multiplayer da Unity. O pool coletivo de conhecimento foi mais do que suficiente para nos ajudar a chegar à linha de chegada.
Trabalhar na Unity significa que posso colaborar ao lado de pessoas experientes em redes que trabalham duro para desenvolver recursos e documentação úteis que são projetados para ajudar todos a começar com o desenvolvimento multiplayer. O site de documentação multiplayer da Unity foi útil muitas vezes – desde me familiarizar com a terminologia básica de rede até lidar com latência até realmente codificar com NGO.
Estamos definitivamente empolgados com Galactic Kittens. Gostaríamos que você, e futuros usuários do NGO, usassem este exemplo como um passo na direção certa em sua jornada de aprendizado multiplayer. Sinta-se à vontade para entrar em contato no servidor Discord ou fóruns para fazer perguntas ou fornecer feedback e sugestões.
Uma das coisas que estou ansioso para aprender é como adicionar pooling de objetos a um exemplo de jogo multiplayer. Esta é a técnica que permite pré-alocar a memória necessária para objetos que são gerados repetidamente durante uma sessão de jogo. Em um experimento anterior, eu tentei essa técnica em um projeto offline do Unity e definitivamente pode melhorar a eficiência de execução do seu jogo. Aplicamos essa técnica no Boss Room e em outras amostras do UGS também.
Se você está começando sua própria jornada multiplayer, há muitos recursos que minha equipe na Unity oferece para ajudar a facilitar isso para você.
Eu recomendaria começar na página Netcode for GameObjects, onde você pode se familiarizar com o pacote. Em seguida, você pode explorar o NGO através da amostra Galactic Kittens ou dar pequenos passos com amostras pequenas.
Uma vez que você esteja em sua jornada, recomendo entrar no servidor Discord Unity Multiplayer Networking e conferir os fóruns. E, se você sentir que Galactic Kittens é muito simples ou não é um desafio suficiente, eu definitivamente encorajaria você a conferir Boss Room, que é um jogo de amostra 3D completo que leva o desenvolvimento do NGO a um nível pronto para produção.
Para levar seu jogo online, Unity Gaming Services pode ajudar ainda mais – seja você esteja procurando adicionar os serviços de Lobby ou Matchmaker, chat de voz e texto com Vivox, ou até soluções de hospedagem como o serviço P2P Relay ou Game Server Hosting. Feliz criação!
Para saber mais sobre as tendências recentes e o futuro do multiplayer, leia o Relatório de Multiplayer da Unity 2022, que agrega os resultados de mais de 1.500 respostas de pesquisa nos EUA, Reino Unido, Japão e Coreia.
