[RESOLVIDO] Chamar metodo em todo os players - Unity multiplayer
2 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Chamar metodo em todo os players - Unity multiplayer
Oi pessoal
Estou criando um mini game de cards por turno, ja tenho boa parte funcionando e preciso fazer com que quando meu player atual aperte um botao, uma animação de uma imagem aconteça para todos os outros players.
Eu consegui fazer isso, mas realizo essa checagem no script do player > CmdChamaAnimacaoUI e checo no update e ai atualiza pra todos.
Mas eu tenho alguns tipos de animação pra mostrar e nao fica viavel fazer no update.
Como eu posso fazer pra meu player falar pros demais jogadores chamarem um método localmente?
Estou criando um mini game de cards por turno, ja tenho boa parte funcionando e preciso fazer com que quando meu player atual aperte um botao, uma animação de uma imagem aconteça para todos os outros players.
Eu consegui fazer isso, mas realizo essa checagem no script do player > CmdChamaAnimacaoUI e checo no update e ai atualiza pra todos.
Mas eu tenho alguns tipos de animação pra mostrar e nao fica viavel fazer no update.
Como eu posso fazer pra meu player falar pros demais jogadores chamarem um método localmente?
DevFrustrada- Iniciante
- PONTOS : 1298
REPUTAÇÃO : 3
Respeito as regras :
Re: [RESOLVIDO] Chamar metodo em todo os players - Unity multiplayer
Normalmente você cria uma variável que é sincronizada sempre que o valor for alterado no servidor, quando essa variável é alterada ela chama um metodo da sua escolha, sem a necessidade de verificar todo frame na Update.
Também dá pra chamar um RPC no servidor, ele também pode ser executado pra todos os clientes.
Pra dizer com certeza preciso saber qual biblioteca de rede está utilizando, Photon, Mirror, etc.
Também dá pra chamar um RPC no servidor, ele também pode ser executado pra todos os clientes.
Pra dizer com certeza preciso saber qual biblioteca de rede está utilizando, Photon, Mirror, etc.
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] Chamar metodo em todo os players - Unity multiplayer
Estou usando Unet , mirror
mas terei alguns tipos de animacão: a batalha, vitoria, derrota e empate.
Devo criar uma syncvar pra cada uma?
tipo, [syncVar] animBatalha, animVitoria, animDerrota ?
mas se mudo ela no command tbm nao funciona, apenas se eu checar no update if animBatalha == true > scripUI...
Uso assim o command
[Command]
public void CmdChamaAnimacaoUI ()
{
scriptUI.AnimacaoBatalha();
}
como funciona o rpc?
mas terei alguns tipos de animacão: a batalha, vitoria, derrota e empate.
Devo criar uma syncvar pra cada uma?
tipo, [syncVar] animBatalha, animVitoria, animDerrota ?
mas se mudo ela no command tbm nao funciona, apenas se eu checar no update if animBatalha == true > scripUI...
Uso assim o command
[Command]
public void CmdChamaAnimacaoUI ()
{
scriptUI.AnimacaoBatalha();
}
como funciona o rpc?
DevFrustrada- Iniciante
- PONTOS : 1298
REPUTAÇÃO : 3
Respeito as regras :
Re: [RESOLVIDO] Chamar metodo em todo os players - Unity multiplayer
Não sei como seu jogo está estruturado, isso aqui é um chute.
Eu criaria apenas uma SyncVar do tipo byte, no server eu escolheria um valor conforme a animação desejada.
Nos clientes quando a SyncVar do tipo byte fosse atualizada, eu usaria um hook em algum metodo, passando o byte como parâmetro. Nesse método eu mudaria a animação conforme o valor.
Nesse caso o código é executado APENAS no seu jogador (versão que existe na sua maquina e na maquina das outras pessoas)
Com o ClientRPC, o código seria executado em TODOS os jogadores, caso usasse o TargetRPC sem passar um target, seria similar a usando usando a syncvar
Eu criaria apenas uma SyncVar do tipo byte, no server eu escolheria um valor conforme a animação desejada.
Nos clientes quando a SyncVar do tipo byte fosse atualizada, eu usaria um hook em algum metodo, passando o byte como parâmetro. Nesse método eu mudaria a animação conforme o valor.
Nesse caso o código é executado APENAS no seu jogador (versão que existe na sua maquina e na maquina das outras pessoas)
- Código:
using Mirror;
public class AnimServer : NetworkBehaviour
{
[SyncVar(hook =(nameof(TocarAnimacao)))]
byte codigoAnim;
public void ChamarAnimacao()
{
CmdChamarAnimacao(0);
}
[Command]
void CmdChamarAnimacao(byte valor)
{
codigoAnim = valor;
}
void TocarAnimacao(byte valorAntigo, byte valorNovo)
{
if(valorNovo == 0)
{
//Animação 0
}
else if(valorNovo == 1)
{
//animacao 1
}
}
}
Com o ClientRPC, o código seria executado em TODOS os jogadores, caso usasse o TargetRPC sem passar um target, seria similar a usando usando a syncvar
- Código:
using Mirror;
public class AnimServer : NetworkBehaviour
{
public void ChamarAnimacao()
{
CmdChamarAnimacao(0);
}
[Command]
void CmdChamarAnimacao(byte valor)
{
RpcChamarAnimacao(valor);
}
[ClientRpc]
void RpcChamarAnimacao(byte valor)
{
if (valor == 0)
{
//Animação 0
}
else if (valor == 1)
{
//animacao 1
}
}
}
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] Chamar metodo em todo os players - Unity multiplayer
quando você diz server eu poderia chamar no meu client que tem autoridade no momento?
Entao se o meu client atual chamar o rpc vai atualizar pra todos em suas próprias maquinas? Pois cada client tem o mesmo script player e de ui e etc.. é deles acessarem eles proprios , o scriptUI e chamarem a animacao
Entao se o meu client atual chamar o rpc vai atualizar pra todos em suas próprias maquinas? Pois cada client tem o mesmo script player e de ui e etc.. é deles acessarem eles proprios , o scriptUI e chamarem a animacao
DevFrustrada- Iniciante
- PONTOS : 1298
REPUTAÇÃO : 3
Respeito as regras :
Re: [RESOLVIDO] Chamar metodo em todo os players - Unity multiplayer
Sim, quando digo Server é o código com a tag [Command].
O script é um só, mas isso vai ser executado no seu player que existe no Servidor (você como player existe em três lugares, na sua maquina, no server e na maquina das outras pessoas) cada tag faz o código executar em um lugar diferente.
Você tem autoridade do seu jogador na sua maquina, se esse script ficar nele você consegue chamar o comando(que roda no servidor), alterando a Syncvar(no servidor) e uma vez alterada lá, ela é alterada automaticamente pra todas as versões de você.
Quando isso ocorrer, o metodo que deixei no hook é chamado passando o valor atualizado desse byte como "valorNovo", aí você faz o que quiser com o numero, toca uma anim diferente, etc.
O script é um só, mas isso vai ser executado no seu player que existe no Servidor (você como player existe em três lugares, na sua maquina, no server e na maquina das outras pessoas) cada tag faz o código executar em um lugar diferente.
Você tem autoridade do seu jogador na sua maquina, se esse script ficar nele você consegue chamar o comando(que roda no servidor), alterando a Syncvar(no servidor) e uma vez alterada lá, ela é alterada automaticamente pra todas as versões de você.
Quando isso ocorrer, o metodo que deixei no hook é chamado passando o valor atualizado desse byte como "valorNovo", aí você faz o que quiser com o numero, toca uma anim diferente, etc.
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] Chamar metodo em todo os players - Unity multiplayer
entendi , muito obrigada! vou revisar o que tenho e tentar o hook e rpc. se conseguir aviso aqui como fiz!
obrigada pela ajuda
obrigada pela ajuda
DevFrustrada- Iniciante
- PONTOS : 1298
REPUTAÇÃO : 3
Respeito as regras :
Re: [RESOLVIDO] Chamar metodo em todo os players - Unity multiplayer
De nada, olha, faz ou usando a SyncVar junto com o hook, ou com o ClientRpc, não tem necessidade dos dois, pelo que entendi do seu problema, eu usaria a Syncvar.
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] Chamar metodo em todo os players - Unity multiplayer
Consegui!
Fiz da fdorma que me falou:
[SyncVar(hook = (nameof(TocaUIAniml)))] byte codigoAnim;
Quando o jogador aperta o botao eu ja passo um ChamaAnimacao(0);
Agora vou ver como pego essas imagens dos guerreiros especificos da batalha kk ja tenho uma ideia. Obrigada mesmo!
Fiz da fdorma que me falou:
[SyncVar(hook = (nameof(TocaUIAniml)))] byte codigoAnim;
Quando o jogador aperta o botao eu ja passo um ChamaAnimacao(0);
- Código:
public void ChamaAnimacao( byte valor)
{
{
CmdChamaAnimacao(valor);
}
}
[Command]
void CmdChamaAnimacao(byte valor)
{
codigoAnim = valor;
}
void TocaUIAnim(byte valorantigo, byte valorNovo)
{
if (valorNovo == 0)
{
scriptUI.CarregaAnim(AnimBatalha.guerreiroA, guerreiroB);
}
else if (valorNovo == 1)
{
//animacao 1
}
}
Agora vou ver como pego essas imagens dos guerreiros especificos da batalha kk ja tenho uma ideia. Obrigada mesmo!
DevFrustrada- Iniciante
- PONTOS : 1298
REPUTAÇÃO : 3
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] como chamar uma void com get component unity C#
» [RESOLVIDO] Metódo melhor que esse meu script para criar um relógio?
» [RESOLVIDO] Não posso chamar uma matriz por outra?
» [TUTORIAL]Como Chamar Um Método Usando Uma String como Parametro
» [RESOLVIDO] Como ajustar o volume em todo o jogo
» [RESOLVIDO] Metódo melhor que esse meu script para criar um relógio?
» [RESOLVIDO] Não posso chamar uma matriz por outra?
» [TUTORIAL]Como Chamar Um Método Usando Uma String como Parametro
» [RESOLVIDO] Como ajustar o volume em todo o jogo
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos