EventoObtenha 50% de desconto no seu ingresso para MongoDB.local Londres em outubro 2. Use o código WEB50Saiba mais >>
Desenvolvedor MongoDB
Central de desenvolvedor do MongoDBchevron-right
Idiomaschevron-right
C#chevron-right

Envio e solicitação de dados do MongoDB em um jogo Unity

Nic Raboy8 min read • Published Jan 28, 2022 • Updated Sep 09, 2024
UnityC#
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Você está trabalhando em um jogo no Unity e está precisando usar um banco de dados na nuvem? Armazenar seus dados localmente funciona para muitos jogos, mas há muitos cenários de jogos em que você precisa usar um banco de dados externo. Talvez você precise enviar sua pontuação mais alta para uma tabela de classificação, ou talvez precise salvar as estatísticas e o inventário do jogador para poder jogar em vários dispositivos. Há muitos motivos para listar por que um banco de dados remoto pode fazer sentido para o seu jogo.
Se você está acompanhando a publicação de conteúdo no MongoDB Developer Hub e em nosso canalTwitch, saberá que estou trabalhando em uma série de desenvolvimento de jogos com Adrienha Tacke. Esta série gira em torno da criação de um jogo multijogador 2D com o Unity que usa o MongoDB como parte do componente online. Até agora, não comunicamos o jogo com o MongoDB.
Neste tutorial, vamos ver como fazer solicitações HTTP de um jogo Unity para um backend que se comunica com MongoDB. O backend já foi desenvolvido em um tutorial intituladoCriando uma loja de perfil de usuário para um jogo com Node.js e MongoDB. Agora vamos aproveitá-lo em nosso jogo.
Para ter uma ideia de onde estamos na série de tutoriais, dê uma olhada na imagem dinâmica abaixo:
Exemplo de portas falsas de pessoas em queda livre
Para levar isso para o próximo nível, faz sentido enviar dados para o MongoDB quando o jogador cruzar a linha de chegada. Por exemplo, podemos enviar quantos passos foram dados pelo jogador para chegar à linha de chegada, ou quantas vezes o jogador colidiu com algo, ou até mesmo em que lugar o jogador se classificou após a conclusão. Os dados enviados não importam realmente no momento.
A suposição é que você está acompanhando a série de tutoriais e está pulando de onde paramos. Caso contrário, algumas das etapas que se referem ao nosso projeto podem não fazer sentido, mas os conceitos podem ser aplicados em seu próprio jogo. Os tutoriais desta série até agora são:
Se você quiser visualizar o código-fonte do projeto, ele pode ser encontrado em GitHub.

Criando uma classe C# no Unity para representar o modelo de dados no MongoDB

Como o Unity, a partir de agora, não tem um driver oficial do MongoDB, o envio e o recebimento de dados do MongoDB do Unity não são gerenciados para você. Teremos que nos preocupar com a organização e desorganização de nossos dados, além de fazer a solicitação. Em outras palavras, precisaremos manipular nossos dados manualmente de e para as classes JSON e C#.
Para tornar isso possível, precisaremos começar com uma classe que represente nosso modelo de dados no MongoDB.
No diretório Assets/Scripts do seu projeto, crie um arquivo PlayerData.cs com o seguinte código:
Observe que essa classe não estende a classe MonoBehavior. Isso ocorre porque não planejamos anexar esse script como um componente em um objeto de jogo. Aspropriedades public-definidas na classePlayerData representam cada um dos campos do nosso banco de dados. No exemplo acima, temos apenas alguns selecionados, mas você poderia adicionar tudo do nosso armazenamento de perfil de usuário, se quisesse.
É importante utilizar o identificadorpublic para qualquer coisa que tenha relevância para o banco de dados.
Precisamos fazer mais algumas alterações na classePlayerData. Adicione as seguintes funções à classe:
Observe que os nomes das funções são parecidos com o que você encontraria em JavaScript se fosse um desenvolvedor JavaScript. O Unity espera que enviemos dados de string em nossas solicitações em vez de objetos. A boa notícia é que o Unity também fornece uma classe deJsonUtilityauxiliar que converterá objetos em strings e strings em objetos.
A funçãoStringify pegará todas as variáveispublic da classe e as converterá em uma string JSON. Os campos no objeto JSON corresponderão aos nomes das variáveis na classe. A funçãoParse pegará uma string JSON e a converterá de volta em um objeto que pode ser usado em C#.

Envio de dados com POST e recuperação de dados com GET em um jogo Unity

With a class available to represent our data model, we can now send data to MongoDB as well as retrieve it. Unity provides a UnityWebRequest class for making HTTP requests within a game. This will be used to communicate with a back end designed with a particular programming language.
Vamos passar o resto do nosso tempo no arquivoAssets/Scripts/Player.csdo projeto . Esse script é anexado ao nosso player como um componente e foi criado no tutorial intitulado Introdução ao Unity para criar um jogo 2D. Em seu próprio jogo, realmente não importa qual script de objeto de jogo você usa.
Abra o arquivoAssets/Scripts/player.cs e verifique se ele é semelhante ao seguinte:
Removai vários códigos do tutorial anterior, pois isso não afeta nada que estejamos planejando fazer. O código anterior estava fortemente relacionado à movimentação do jogador pela tela e deve ser deixado para o jogo real, mas é ignorado neste exemplo, pelo menos por enquanto.
Duas coisas a serem notadas que são importantes são as importações:
As duas importações acima são importantes para os recursos de rede do Unity. Sem eles, não poderíamos fazer solicitações GET e POST corretamente.
Antes de fazer uma solicitação, vamos incluir nossa classePlayerData. Faça as seguintes alterações no códigoAssets/Scripts/player.cs:
No código acima, observe que estamos criando um novo objetoPlayerDatae atribuindo um valor ao campoplummie_tag. Também estamos usando a funçãoOnCollisionEnter2Dpara ver se nosso objeto de jogo colide com alguma coisa. Como nossa função é muito simples, as colisões podem ser com paredes, objetos etc. e nada em particular. As colisões aumentarão o contadorcollisions.
Portanto, temos dados para trabalhar, dados que precisamos enviar ao MongoDB. Para fazer isso, precisamos criar algumas funçõesIEnumerator e usar chamadas de coroutine no Unity. Isso nos permitirá realizar atividades assíncronas, como fazer solicitações da web.
No arquivoAssets/Scripts/Player.cs, adicione a seguinte funçãoIEnumerator :
A funçãoDownload será responsável por recuperar dados de nosso banco de dados para serem levados ao jogo Unity. Ele está esperando um id o qual usaremos um plummie_id e um callback para que possamos trabalhar com a resposta fora da função. A resposta deve ser PlayerData, que é a do modelo de dados que acabamos de criar.
Após enviar a solicitação, verificamos se houve erros ou se ela foi bem-sucedida. Se a solicitação for bem-sucedida, podemos converter a string JSON em um objeto e invocar a chamada de resposta para que o pai possa trabalhar com o resultado.
Enviar dados com uma carga útil, como em uma solicitação POST, é um pouco diferente. Assuma a seguinte função:
Na função Upload, estamos esperando uma string JSON do nosso perfil. Este perfil foi definido na classe PlayerDatae são os mesmos dados que passamos na funçãoDownload.
A diferença entre essas duas funções é que o POST está enviando uma carga útil. Para que isso funcione, a string JSON precisa ser convertida em byte[] e os manipuladores de upload e download precisam ser definidos. Uma vez feito isso, tudo continua como de costume.
Depende de você o que deseja retornar ao pai. Como estamos criando dados, achei que não haveria problema em retornar apenas true se for bem-sucedido e false se não for. Para demonstrar isso, se não houver erros, a resposta é comparada com uma string de objetos vazia. Se um objeto vazio for retornado, então false. Caso contrário, verdadeiro. Provavelmente, essa não é a melhor maneira de responder após uma criação, mas isso cabe ao criador (você, o desenvolvedor) decidir.
As funções são criadas. Agora, precisamos usá-los.
Vamos fazer uma alteração na funçãoStart:
Quando o script é executado - ou, em nosso exemplo, quando o jogo é executado - e o jogador entra em cena, o método StartCoroutineé executado. Estamos fornecendo oplummie_tag como nosso valor de pesquisa e estamos imprimindo os resultados que retornam.
Talvez queiramos que a funçãoUpload se comporte um pouco diferente. Em vez de fazer a solicitação imediatamente, talvez queiramos fazer a solicitação quando o jogador cruzar a linha de chegada. Para isso, talvez adicionemos um pouco de lógica ao métodoFixedUpdate :
No código acima, verificamos se a posição do jogador está além de um determinado valor no eixo x. Se isso for verdade, executamos a funçãoUpload e imprimimos os resultados.
No entanto, o exemplo acima não está isento de problemas. A partir de agora, se cruzarmos a linha de chegada, receberemos muitas solicitações, pois nosso código será executado continuamente. Podemos corrigir isso adicionando uma variável booleana à mistura.
Na parte superior do arquivoAssets/Scripts/Player.cs, com o restante das declarações de variáveis, adicione o seguinte:
A ideia é que, quando a variável_isGameOver for verdadeira, não devemos estar executando determinada lógica, como as solicitações da web. Vamos inicializar a variável como falsa no métodoStartda seguinte forma:
Com a variável inicializada, podemos usá-la antes de enviar uma solicitação HTTP após cruzar a linha de chegada. Para fazer isso, faríamos um pequeno ajuste no código assim:
Depois que o jogador cruza a linha de chegada, o código HTTP é executado e o jogo é marcado como game over para o jogador, evitando novas solicitações.

Conclusão

Você acabou de ver como usar a classeUnityWebRequestno Unity para fazer solicitações HTTP de um jogo para um servidor Web remoto que se comunica com o MongoDB. Isso é valioso para qualquer jogo que precise armazenar informações do jogo remotamente ou recuperá-las.
Há muitas outras maneiras de usar a classeUnityWebRequest, mesmo em nosso próprio script de jogador, mas os exemplos que usamos devem ser um ótimo ponto de partida.
Esta série de tutoriais faz parte de uma série transmitida no Twitch. Para ver essas transmissão ao vivo enquanto acontecem, siga o canal do Twitch e conecte-se.

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse Tutorial
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Tutorial

Salvando dados no Unity3D usando o PlayPrefs


Sep 09, 2024 | 11 min read
Tutorial

Integrar o Azure Key Vault com a criptografia em nível de campo no lado do cliente do MongoDB


May 24, 2022 | 9 min read
Tutorial

Introdução ao Realm SDK para Unity


Feb 03, 2023 | 8 min read
Tutorial

Introdução ao Unity para criar um jogo 2D


Apr 02, 2024 | 9 min read
Sumário