RPC e lógica de jogo no servidor
Última atualização: 16 de julho de 2026
RPC no PlayServ é o mecanismo para rodar lógica de jogo no game server. O código de servidor é escrito dentro do codebase do cliente, marcado para descoberta, extraído pelo analisador de código durante a implantação e executado no runtime do servidor.
Quando usar RPC
Use RPC quando você precisa que a lógica de gameplay execute no game server, para reduzir o risco de cheating e evitar expor cenários importantes na build do cliente.
O PlayServ não depende de rodar um runtime completo de engine headless no servidor, como é comum em algumas arquiteturas tradicionais de multiplayer. Em vez disso, o PlayServ analisa o código do jogo, descobre o código de servidor e implanta no runtime do servidor apenas esse código.
A lógica de servidor é descrita em classes separadas do código de gameplay do cliente. Isso permite execução e depuração locais, mas exige vincular o código de servidor onde ele é usado.
Modelo de execução no servidor
A lógica de servidor é escrita por desenvolvedores de cliente no codebase do cliente, mas precisa ser descrita explicitamente para que o analisador de código consiga detectá-la e enviá-la ao servidor durante a implantação.
Um exemplo mínimo de classe de servidor:
[Server]
public class Domain
{
// May contain state
bool flag = true;
public void RollDice(int dice)
{
flag = dice % 2 > 0;
var player = PlayServ.GetPlayer("a123");
player.Name = "Vasya";
player.Update();
}
public string DoSomethingCool(int dice)
{
return flag ? "Ice!" : "Nice";
}
}
Chamando esse código de servidor a partir do código do cliente:
class CustomBehaviour : NetworkBehaviour
{
// Allows local debugging and remote execution
private Domain _domain = PlayServ.Remote(Domain);
public void Init(Vector3 velocity, PlayerRef owner)
{
_domain.RollDice(1);
_domain.DoSomethingCool(); // "Ice!"
}
}
Chamando o SDK a partir do código de servidor
O código de servidor no PlayServ tem acesso ao SDK, o que permite implementar um game server completo.
O SDK usado para compilar o código de servidor inclui o mesmo protocolo de transporte que os módulos de serviço do SDK usam para trocar sinais entre si. Isso permite que o código de servidor atue como um cliente do SDK ao chamar outro código de servidor ou módulos de plataforma.
Diferente de um client de jogo comum, o código de servidor não precisa se conectar ao Proxy Module. Os sinais dele são roteados direto para o barramento e então entregues aos destinatários finais.
Chamadas servidor-a-servidor e empacotamento
Se uma classe de servidor chama outra classe de servidor, as classes chamadas podem não ser incluídas no bundle do servidor (Archive.zip).
Por causa disso, o analisador do lado do servidor substitui essas referências por um stub voltado a RPC e gera uma classe proxy com stubs de método que fazem as invocações via RPC.
// Instead of:
private RPC_Domain _domain = PlayServ.Remote(RPC_Domain);
// Use:
PlayServ.Remote("Domain").Invoke("DoSomethingCool", params);
Classes de servidor estáticas
Uma abordagem alternativa é usar classes de servidor static. Isso elimina a necessidade de inicializar domínios de servidor e permite que o analisador detecte chamadas a métodos [Server] e as substitua por chamadas RPC de forma mais confiável.
Próximos passos
- Extending SDK Components — estenda o comportamento do SDK com Handlers e Pipelines em estilo middleware
- Events system — contratos de Event e Subscriptions
Wait/Stoppara mensagens entre cliente e servidor - Data Mutation & Model Extending — persistindo mudanças de dados e comportamento de Entity como métodos