Pitch: Utilização da WebRTC na construção de uma arquitetura peer-to-peer para jogos online na Unity 3D
Olá a todos!
Hoje vou comentar um pouquinho da minha trajetória no desenvolvimento do meu TCC para o curso de Engenharia de Computação. Estou na apresentação e defesa da ideia no momento. Entre setembro e outubro o desenvolvimento irá começar a todo vapor!
O projeto possui o seguinte título: "Utilização da WebRTC na construção de uma arquitetura peer-to-peer para jogos online na Unity 3D".
Motivação
A maioria das arquiteturas de rede que são utilizadas em jogos multiplayer online são cliente-servidor. Unindo isso ao meu gosto por jogos, o presente projeto trata de construir uma alternativa ligada a implementação da arquitetura peer-to-peer para:
- Estudas da viabilidade de implementação;
- Caráter comparativo entre arquiteturas;
Objetivo geral
Propor um framework open source para multiplayer online de jogos na Unity usando WebRTC.
Objetivos específicos
- Construir o mesmo jogo multiplayer online em duas arquiteturas diferentes, usando Photon Unity Networking (cliente-servidor) e usando WebRTC (peer-to-peer);
- Elaborar um framework open source usando o WebRTC para ter acesso a arquitetura peer-to-peer;
- Realizar comparações através de métricas entre as duas arquiteturas de rede.
Por que WebRTC?
É uma tecnologia open source e gratuita promovida pela Google para comunicação P2P de forma nativa através de APIs do Javascript para comunicação de áudio, vídeo e dados em geral. Além disso, meu framework será para jogos exportados para WebGL na Unity, portanto conseguirei comunicar isso usando o próprio navegador.
Experimentação
Comunicação entre C# e Javascript na Unity
No processo de experimentação comecei exatamente com esse tópico. É algo que no começo eu não sabia que era possível e após olhar a documentação da própria engine vi que é possível realizar uma comunicação bi-direcional, da Unity pro navegador e do navegador para a Unity. Nesse meu processo inicial fiz apenas uma comunicação da Unity com o navegador, ou seja, chamei uma função Javascript no C#.
Para criar tal comunicação é necessário criar um arquivo ".jslib" que seria uma biblioteca de funções e variáveis. Essa biblioteca deve estar na pasta Plugins (dentro de Assets do seu projeto).
Após isso é criado um código em C# para justamente chamar essa função DialogMessage para exibir um texto vindo da Unity diretamente numa caixa de diálogo de mensagem no navegador.
O código é simples, basta chamar uma dependência nativa da linguagem para comunicar com códigos externos e depois usar um modificador chamado 'extern' para isso. Esse script é vinculado a um GameObject qualquer na Unity e quando executado o jogo o código é rodado apenas uma vez, pois a função está sendo chamada no método Start. O resultado fica assim (após exportação para WebGL):
Testes com WebRTC na Unity
Agora vamos para o tema principal do meu trabalho que é justamente aplicar essa tecnologia comum a aplicações de vídeo/áudio chamadas nos navegadores, como em aplicações Google Meet por exemplo, na Unity.
O exemplo simples inicial que eu apliquei foi apenas conectar a um 'Peer ID' e enviar um valor flutuante de 0 a 10 através de um deslizador, é possível ver na figura abaixo:
Essas informações foram enviadas diretamente para um outro local, uma página HTML simulando um cliente de outro local:
Para criação desse exemplo eu usei a biblioteca PeerJS para facilitar a escrita e abstrair alguns itens da WebRTC. A minha ideia é tornar isso mais simples ainda a implementação de jogos multiplayer online na Unity usando a arquitetura de rede peer-to-peer, pois é algo que tem muitos benefícios, um deles é escalabilidade e baixo custo de hospedagem.
Agradecimentos
Obrigado a todos pela atenção e também pelo espaço de postar aqui. Espero que gostem (e que dê tudo certo no processo de implementação futura). Isso foi apenas um resumão de todo processo da construção dos exemplos e também sobre a tecnologia WebRTC.
Link do repositório que em breve terá tudo melhor detalhado e o progresso da implementação