Construindo meu primeiro jogo multiplayer com Netcode for GameObjects

ESTEBAN MALDONADO / UNITY TECHNOLOGIESSenior Developer Advocate, Multiplayer Solutions
Oct 26, 2022|13 Min
Construindo meu primeiro jogo multiplayer com Netcode for GameObjects
Esta página da Web foi automaticamente traduzida para sua conveniência. Não podemos garantir a precisão ou a confiabilidade do conteúdo traduzido. Se tiver dúvidas sobre a precisão do conteúdo traduzido, consulte a versão oficial em inglês da página da Web.

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.

O que é Galactic Kittens?

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.

Como o Galactic Kittens foi construído?
Aprendendo enquanto desenvolve

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.

Sim, esta é minha primeira tentativa de fazer o Galactic Kittens acontecer.

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.

Do protótipo à exploração espacial

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.

Gerenciamento de conexão

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.)

Tela de seleção de personagens do jogo de exemplo Galactic Kittens.

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.

Inimigos básicos

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.

A batalha contra o chefe

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.

GIF de "aviso" do jogo de amostra Galactic Kittens

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 que nos ajudou ao longo do caminho?
A comunidade multiplayer

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.

A documentação multiplayer

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.

O que estamos aprendendo a seguir?

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.

Como você pode começar a aprender desenvolvimento multiplayer?

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.