Voltar para o Blog
Quest Log

Como testar jogo multiplayer sozinho na máquina

Duas janelas do mesmo jogo lado a lado na tela, uma como host e outra como cliente, em teste local

Como testar jogo multiplayer sozinho na sua máquina: rode host e cliente no Godot 4 com Run Multiple Instances, conecte via 127.0.0.1 e depure sem outra pessoa.

Ferramenta:Godot

Montar o esqueleto de rede de um jogo e descobrir que você precisa de um amigo online só para ver se a conexão funciona é uma das frustrações mais comuns de quem começa. A boa notícia é que dá para testar jogo multiplayer sozinho na sua própria máquina, rodando o host e o cliente ao mesmo tempo, lado a lado, sem depender de ninguém. No Godot 4 isso é quase trivial graças a um recurso embutido no editor, e neste guia você vai ver o fluxo completo: abrir várias instâncias, decidir quem é host e quem é cliente, conectar por localhost, organizar as janelas e automatizar o papel de cada uma com argumentos de linha de comando. No final, um resumo rápido de como o mesmo conceito se aplica na Unity.

A ideia por trás de tudo é simples. Um jogo multiplayer é só dois ou mais programas conversando por uma conexão. Nada obriga esses programas a estarem em máquinas diferentes. Você pode rodar duas cópias do mesmo jogo no seu computador, fazer uma abrir o servidor e a outra conectar nele, e para a lógica de rede não faz diferença nenhuma: os pacotes vão e voltam exatamente como iriam entre duas máquinas, só que pelo caminho interno da sua própria máquina. É o ambiente de teste ideal, porque é rápido, repetível e isola o seu código de qualquer problema de rede de verdade.

Run Multiple Instances: o atalho nativo do Godot 4

O Godot 4 traz um recurso que resolve o problema com dois cliques. No menu Debug, no topo do editor, existe a opção Run Multiple Instances. Ao abrir esse submenu você escolhe quantas cópias quer rodar: 1, 2, 3 ou 4. Selecione 2 para o caso mais comum (um host e um cliente), e depois rode o projeto normalmente com F5. O Godot vai abrir duas janelas separadas, cada uma um processo independente do seu jogo, prontas para se conectarem.

Essa é a diferença que economiza horas. Antes desse recurso, era preciso exportar uma build e abrir o executável ao lado do editor, ou ficar manipulando cópias do projeto na mão. Agora você itera direto do editor: muda uma linha de código, aperta F5, e já tem duas instâncias novas conversando. Para quatro jogadores, escolha 4 instâncias e o Godot abre as quatro de uma vez.

Um detalhe prático de produtividade: as janelas costumam abrir empilhadas no mesmo ponto da tela. Vale configurar o tamanho e a posição da janela no projeto, ou arrastar as janelas para cantos diferentes assim que abrem, de modo a ver o host e o cliente ao mesmo tempo. Ver as duas telas lado a lado é o que torna o teste útil: você aperta um botão numa janela e confere na hora se a ação aparece na outra, que é exatamente o que a sincronização de rede precisa garantir.

Conectando host e cliente por 127.0.0.1

Com duas instâncias abertas, falta decidir quem faz o quê. Uma instância cria o servidor e a outra conecta nele usando o endereço de loopback, o famoso 127.0.0.1 (ou o apelido localhost). Esse endereço sempre aponta para a própria máquina, então o cliente que conecta nele está falando com o servidor que está rodando ali do lado, na mesma máquina. Os pacotes nem chegam a sair para a placa de rede.

No Godot 4 o código é curto. O host instancia um ENetMultiplayerPeer, chama create_server e entrega o peer ao sistema de multiplayer. O cliente faz o espelho com create_client, apontando para 127.0.0.1:

extends Node

const PORTA: int = 8910
const MAX_JOGADORES: int = 4

func virar_host() -> void:
    var peer: ENetMultiplayerPeer = ENetMultiplayerPeer.new()
    var erro: int = peer.create_server(PORTA, MAX_JOGADORES)
    if erro != OK:
        push_error("Falha ao abrir o servidor na porta %d" % PORTA)
        return
    multiplayer.multiplayer_peer = peer
    print("Host no ar na porta %d." % PORTA)

func virar_cliente() -> void:
    var peer: ENetMultiplayerPeer = ENetMultiplayerPeer.new()
    var erro: int = peer.create_client("127.0.0.1", PORTA)
    if erro != OK:
        push_error("Falha ao iniciar conexao com o host local.")
        return
    multiplayer.multiplayer_peer = peer
    print("Cliente tentando conectar em 127.0.0.1:%d." % PORTA)

No começo, a forma mais simples de escolher o papel é colocar dois botões na cena: um "Host" e um "Cliente". Você abre as duas janelas, clica em Host numa e em Cliente na outra, e pronto, o teste roda. Isso funciona perfeitamente e é o jeito recomendado para os primeiros experimentos. Se você quer entender a fundo a parte de endereços, porta e firewall quando sair do localhost para a rede de verdade, o guia de conectar por IP na rede local no Godot cobre esse próximo passo.

Curso de Godot
Quer fazer seu primeiro jogo na Godot?

No curso de Godot da CursoGame.Dev você vai do zero ao primeiro jogo, com um desafio prático em cada level e suporte individual no WhatsApp quando travar.

Conhecer o curso de Godot
Suporte no WhatsAppAcesso vitalícioGarantia de 7 dias

Automatizando o papel com argumentos de linha de comando

Clicar em botões toda vez cansa quando você está testando dezenas de vezes por hora. A solução elegante é deixar o jogo decidir o próprio papel ao iniciar, lendo um argumento de linha de comando. A convenção mais usada é passar --server para a instância que deve ser o host. Se o argumento estiver presente, a instância abre o servidor; se não estiver, ela conecta como cliente.

No Godot você lê os argumentos com OS.get_cmdline_args():

func _ready() -> void:
    var args: PackedStringArray = OS.get_cmdline_args()
    if args.has("--server"):
        virar_host()
    else:
        virar_cliente()

Com isso no lugar, basta configurar uma das instâncias para abrir com o argumento --server e a outra sem nada. No editor, você define argumentos extras em Project, Project Settings, na seção de execução, ou passa pela linha de comando ao chamar o executável exportado. O resultado é que, ao rodar, uma janela já nasce host e a outra já nasce cliente conectando no localhost, sem clique nenhum. É o fluxo que acelera muito a iteração quando a rede já está estável e você quer focar no gameplay.

Esse mesmo padrão de argumento é o que você vai reaproveitar quando chegar a hora de rodar um servidor sem janela, por exemplo um servidor dedicado headless no Godot. A instância que recebe --server pode rodar em modo sem interface gráfica, e a lógica que você testou localmente continua valendo.

Erros ao testar jogo multiplayer sozinho

Mesmo no conforto do localhost, algumas coisas travam e vale saber onde olhar. O primeiro erro clássico é esquecer que create_client retornar OK não significa que conectou, significa apenas que a tentativa começou. A confirmação vem pelos sinais connected_to_server e connection_failed, que você deve conectar e tratar. Se a conexão falha instantaneamente mesmo no localhost, quase sempre é porque o host não subiu antes do cliente tentar, ou a porta está diferente entre os dois.

O segundo tropeço é a porta ocupada. Se uma instância anterior do jogo não fechou direito e ficou segurando a porta, a nova tentativa de create_server retorna erro. Por isso o código acima checa o retorno de create_server: em vez de seguir como se tudo estivesse bem, ele avisa. Ao testar com várias instâncias, feche todas as janelas ao terminar, para não deixar processos fantasmas segurando a porta.

O terceiro ponto é confundir o que a conexão faz. Conectar duas instâncias é só o começo: a conexão transporta dados, mas você ainda precisa de RPCs ou de nós sincronizados para que o estado realmente trafegue entre host e cliente. Se as duas janelas conectam mas nada se move de um lado para o outro, o problema não é a conexão, é a camada de sincronização. Para essa parte, veja o básico de RPC no multiplayer do Godot, que mostra como uma função chamada numa máquina roda na outra.

O equivalente na Unity, em resumo

A Unity não traz um botão nativo tão direto quanto o Run Multiple Instances do Godot, mas a necessidade é a mesma e a comunidade resolveu de dois jeitos. O primeiro é o ParrelSync, uma ferramenta gratuita que cria clones do seu projeto que ficam sincronizados com o original. Você abre um segundo editor apontando para o clone, roda os dois ao mesmo tempo, e tem host e cliente conversando por localhost, do mesmo jeito. O segundo caminho, mais rústico, é gerar uma build do jogo e abrir o executável como cliente enquanto o editor roda como host, ou abrir duas cópias da build.

O conceito não muda de engine para engine: duas instâncias do jogo na mesma máquina, uma como servidor e outra como cliente, conversando pelo endereço de loopback. Se você ainda está decidindo qual motor usar para o seu projeto online, vale comparar as opções antes, porque cada engine tem seu fluxo. De todo jeito, dominar o teste local é o que separa quem itera rápido de quem fica travado esperando um amigo entrar. Comece sempre por aqui: duas janelas, localhost, host de um lado e cliente do outro. Quando a lógica funciona assim, você já tem a base pronta para testar com um jogo multiplayer de verdade em duas máquinas e, mais tarde, pela internet.

Perguntas frequentes

Dá para testar jogo multiplayer sozinho sem outra pessoa?

Dá, e é o jeito recomendado de começar. No Godot 4 você usa Debug, Run Multiple Instances para abrir duas ou mais cópias do jogo na mesma máquina. Uma vira host e a outra vira cliente, as duas se conectam por 127.0.0.1 (localhost) e você controla as duas janelas lado a lado. Assim valida toda a lógica de rede antes de envolver outra máquina ou a internet.

Onde fica a opção Run Multiple Instances no Godot?

No menu Debug, no topo do editor, existe o item Run Multiple Instances. Ele abre um submenu onde você escolhe rodar 1, 2, 3 ou 4 instâncias. Depois de selecionar o número, basta rodar o projeto normalmente (F5) e o Godot abre a quantidade de janelas escolhida, cada uma como um processo independente.

O que é 127.0.0.1 e por que usar no teste local?

O 127.0.0.1 é o endereço de loopback, também chamado de localhost. Ele sempre aponta para a própria máquina. Quando o cliente conecta nesse IP, os pacotes nem saem para a rede: eles voltam para o mesmo computador. Isso é perfeito para testar, porque elimina rede, roteador e firewall da equação e isola a sua lógica de multiplayer.

Como fazer uma instância virar host e a outra cliente automaticamente?

A forma mais limpa é ler um argumento de linha de comando. Você pode marcar uma instância para abrir com o argumento --server usando OS.get_cmdline_args() e, se o argumento estiver presente, a instância cria o servidor; caso contrário, ela conecta como cliente em 127.0.0.1. Assim você não precisa clicar em nada ao iniciar o teste.

E na Unity, como testo multiplayer sozinho?

A Unity não tem um botão nativo igual ao do Godot, mas a prática comum é usar o ParrelSync, uma ferramenta que cria clones do projeto sincronizados para rodar vários editores ao mesmo tempo, ou gerar uma build separada e abrir a build como um cliente enquanto o editor roda como host. O conceito é o mesmo: duas instâncias falando por localhost.