[TUTORIAL] Sincronizando variáveis no multiplayer
4 participantes
Página 1 de 1
[TUTORIAL] Sincronizando variáveis no multiplayer
Fala galera! blz?
Depois de muito quebrar a cabeça, eu finalmente descobri como sincronizar variáveis de um script. (Lembrando que não irei ensinar a configurar Networking, apenas a sincronizar variáveis)
1º Crie seu script, e adapte-o para multiplayer. Importando a biblioteca de Networking, e trocando para NetworkBehaviour:
2ª em uma linha antes da variável desejada coloque [SyncVar]:
3º Crie uma condição para sua variável ser alterada, essa condição tem que ser "isLocalPlayer" (Se é o jogador local), e faça seu codigo:
4º Agora criamos uma void com "Cmd" (Sem aspas) antes do seu nome: "CmdNome" e em cima da void colocamos [Command], nas variáveis da void, colocamos o tipo de variável que você quer sincronizar (string, bool, GameObject, Transform, etc...), ficando assim:
5º Crie uma void Update, LateUpdate ou FixedUpdate para podermos chamar a outra void q criamos. Ela será chamada se for jogador local if(isLocalPlayer):
6º Depois dentro da void "CmdNome" deixamos a variável "Nome" igual a variável local "NovoNome"
7ª Se seu script for alterar algum UI, importe a blibioteca (Colocando em baixo de using UnityEngine.Networking; isso: using UnityEngine.UI;) e alteramos o texto fora do "isLocalPlayer":
Pronto! Seu script ficará parecido com esse:
Agora é só fazer o teste :D
Depois de muito quebrar a cabeça, eu finalmente descobri como sincronizar variáveis de um script. (Lembrando que não irei ensinar a configurar Networking, apenas a sincronizar variáveis)
1º Crie seu script, e adapte-o para multiplayer. Importando a biblioteca de Networking, e trocando para NetworkBehaviour:
- Código:
using UnityEngine.Networking;
public class NomeDoSeuScript : NetworkBehaviour {
2ª em uma linha antes da variável desejada coloque [SyncVar]:
- Código:
[SyncVar]
public string Nome = "Nome";
public Text Texto;
public InputField LocalDeEscrita;
3º Crie uma condição para sua variável ser alterada, essa condição tem que ser "isLocalPlayer" (Se é o jogador local), e faça seu codigo:
- Código:
if (isLocalPlayer)
{
Nome = LocalDeEscrita.text;
}
- Código:
void Start()
{
if (isLocalPlayer)
{
LocalDeEscrita = FindObjectOfType<InputField>();
}
}
4º Agora criamos uma void com "Cmd" (Sem aspas) antes do seu nome: "CmdNome" e em cima da void colocamos [Command], nas variáveis da void, colocamos o tipo de variável que você quer sincronizar (string, bool, GameObject, Transform, etc...), ficando assim:
- Código:
[Command]
public void CmdNome(string NovoNome)
{
}
5º Crie uma void Update, LateUpdate ou FixedUpdate para podermos chamar a outra void q criamos. Ela será chamada se for jogador local if(isLocalPlayer):
- Código:
void LateUpdate () {
if (isLocalPlayer)
{
Nome = LocalDeEscrita.text;
CmdNome(Nome);
}
}
6º Depois dentro da void "CmdNome" deixamos a variável "Nome" igual a variável local "NovoNome"
- Código:
[Command]
public void CmdNome(string NovoNome)
{
Nome = NovoNome;
}
7ª Se seu script for alterar algum UI, importe a blibioteca (Colocando em baixo de using UnityEngine.Networking; isso: using UnityEngine.UI;) e alteramos o texto fora do "isLocalPlayer":
- Código:
if (isLocalPlayer)
{
Nome = LocalDeEscrita.text;
CmdNome(Nome);
}
Texto.text = Nome;
Pronto! Seu script ficará parecido com esse:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using UnityEngine.Networking;
public class SincVarTest : NetworkBehaviour {
[SyncVar]
public string Nome = "Nome";
public Text Texto;
public InputField LocalDeEscrita;
void Start()
{
if (isLocalPlayer)
{
LocalDeEscrita = FindObjectOfType<InputField>();
}
}
void LateUpdate () {
if (isLocalPlayer)
{
Nome = LocalDeEscrita.text;
CmdNome(Nome);
}
Texto.text = Nome;
}
[Command]
public void CmdNome(string NovoNome)
{
Nome = NovoNome;
}
Agora é só fazer o teste :D
Re: [TUTORIAL] Sincronizando variáveis no multiplayer
seu tópico foi criado em duvidas em geral sendo um tutorial dos membros .
Está ótimo irá ajudar muita gente
Está ótimo irá ajudar muita gente
Phph09- Profissional
- PONTOS : 3790
REPUTAÇÃO : 240
Idade : 19
Respeito as regras :
Re: [TUTORIAL] Sincronizando variáveis no multiplayer
Movido para a área correta.Phph09 escreveu:seu tópico foi criado em duvidas em geral sendo um tutorial dos membros .
Está ótimo irá ajudar muita gente
Re: [TUTORIAL] Sincronizando variáveis no multiplayer
so de eu usar o codigo como NetworkBehaviour
e usar [SyncVar] antes da variavel ele ja aparece para todos os players online ?
tipo eu tenho uns scripts que precisão funcionar igual aos mesmos objetos da lan tipo veiculos portas escadas, por enquanto off line eles funcionam perfeitamente. o game é uma mistura de gta com CS se puder me ajudar agradeço abraço.
e usar [SyncVar] antes da variavel ele ja aparece para todos os players online ?
tipo eu tenho uns scripts que precisão funcionar igual aos mesmos objetos da lan tipo veiculos portas escadas, por enquanto off line eles funcionam perfeitamente. o game é uma mistura de gta com CS se puder me ajudar agradeço abraço.
Yuri Heinz- Avançado
- PONTOS : 3615
REPUTAÇÃO : 38
Idade : 28
Respeito as regras :
Re: [TUTORIAL] Sincronizando variáveis no multiplayer
Hum... interessante, infelizmente não sei uma forma mais prática para sincronizar as variáveis de posicionamento dos veículos enquanto o Client estiver dirigindo ele, mas para sincronizar as variáveis vc criar o esqueleto que ensinei acima (Eu não sei como sincronizar variáveis de uma forma mais prática), mas tam algumas observações:Yuri Heinz escreveu:so de eu usar o codigo como NetworkBehaviour
e usar [SyncVar] antes da variavel ele ja aparece para todos os players online ?
tipo eu tenho uns scripts que precisão funcionar igual aos mesmos objetos da lan tipo veiculos portas escadas, por enquanto off line eles funcionam perfeitamente. o game é uma mistura de gta com CS se puder me ajudar agradeço abraço.
** Crie apenas uma void Cmd, mais de uma não serão sincronizadas.
Vc pode fazer com que quando o Jogador entre no veículo, o mesmo seja chamado no game dos outros jogadores (crie um sistema de identificação por números, quando o jogador entrar no carro ele vai procurar no no jogo do outro jogador o carro que o número seja o mesmo), então na void "CmdNome" vc coloca 2 variáveis Vector3:
- Código:
[Command]
public void CmdSyncCarPos(Vector3 _pos, Vector3 _rot)
{
}
No mesmo script crie 2 variáveis também Vector3 (posição e rotação), e na void FixedUpdate coloque os valores dessa variável. Depois chame a void com essas 2 variáveis criadas (coloque a mesma ordem que está na void):
- Código:
[SyncVar]
public Vector3 posicao;
[SyncVar]
public Vector3 rotacao;
void FixedUpdate()
{
if (isLocalPlayer)
{
posicao = transform.position;
rotacao = transform.eulerAngles;
CmdSyncCarPos(posicao, rotacao);
}
}
- Código:
public bool JogadorLocal;
void Start()
{
JogadorLocal = isLocalPlayer;
}
- Código:
public class SyncCarPos : NetworkBehaviour
{
public JogadorLocal JogadorNoControle;
[SyncVar]
public Vector3 posicao;
[SyncVar]
public Vector3 rotacao;
Depois, no troque os comandos "isLocalPlayer" para "JogadorNoControle.JogadorLocal ":
- Código:
void FixedUpdate()
{
if (JogadorNoControle.JogadorLocal)
{
posicao = transform.position;
rotacao = transform.eulerAngles;
CmdSyncCarPos(posicao, rotacao);
}
}
- Código:
[Command]
public void CmdSyncCarPos(Vector3 _pos, Vector3 _rot)
{
posicao = _pos;
rotacao = _rot;
}
Re: [TUTORIAL] Sincronizando variáveis no multiplayer
nossa cara vc é muito fera
vou colocar o script que eu fiz pra entrar no veiculo, pra fazer o jogo offline ou multiplayer igual o da epoca do ps2 que a tela divide no meio eu ja consegui.
esse primeiro codigo vai no player, dai ele identifica o objeto no caso o veiculo e fala pra ele se o player entrou. se o veiculo esta oucupado é bem expecifico o codigo e tem varias tratativas de erro n da nenhum bug
esse segundo codigo é o que fica no veiculo, ele é so pra pasar as condiçoes que o veiculo se apresenta se esta ocupado o nome dele oque ele faz, vai servir pra fazer aquelas metralhadoras que ficam fixas em algum lugar tambem sabe kkk
vou colocar o script que eu fiz pra entrar no veiculo, pra fazer o jogo offline ou multiplayer igual o da epoca do ps2 que a tela divide no meio eu ja consegui.
esse primeiro codigo vai no player, dai ele identifica o objeto no caso o veiculo e fala pra ele se o player entrou. se o veiculo esta oucupado é bem expecifico o codigo e tem varias tratativas de erro n da nenhum bug
- Código:
using UnityEngine;
using System.Collections;
public class Conduzir : MonoBehaviour {
[Header ("Parametros")]
public Transform Character;
public GameObject ObjetoDeInteracao;
public Rotacionar CodRotacionar;
public PlayerInputs codInputs;
[Header ("Objeto A Interagir")]
public string ObjetoTipo;
public Transform PontoDeEntrada, PontoDeSaida, PontoUtilizavel;
public ObjetoConduzivel CodConduzivel;
public GameObject BotaoAcao;
[Header ("Inputs")]
public bool InputInteracao;
public bool ObjetoInteragivel;
[Header ("Quando estiver Conduzindo")]
public bool Utilizando;
public bool Validado;
public float movementSpeed = 5.0f;
public bool AjustedPosition;
[Space(20)]
[Header ("Timer Enter")]
[Range(0,3)]
public float TimeToEnter = 1.0f;
[Range(0,3)]
public float TimerEnter;
public bool TimerEnterKey;
[Space(20)]
[Header ("Timer Exit")]
[Range(0,3)]
public float TimeToExit = 1.0f;
[Range(0,3)]
public float TimerExit;
public bool TimerExitKey;
private bool Desocupar ;
// Use this for initialization
void Start () {
ObjetoTipo = ("Nenhum Objeto");
codInputs = GetComponent<PlayerInputs> ();
}
// Update is called once per frame
void Update () {
//------------------- Inpults --------------------
InputInteracao = codInputs.Interagir;
if (CodConduzivel != null) {
if (CodConduzivel.Ocupado == true && Utilizando == false && TimerEnterKey == false) {
// --------Desativar ------------------- Desativar objetos;
CodConduzivel.Ativo = false;
ObjetoInteragivel = false;
ObjetoDeInteracao = null;
CodConduzivel = null;
ObjetoTipo = ("Nenhum Objeto");
PontoDeEntrada = null;
PontoDeSaida = null;
PontoUtilizavel = null;
}
if (InputInteracao == true) { // se o comando de for precionado
if (Utilizando == true) { // se o jogador estiver dentro do objeto;
if (TimerEnterKey == false) {
// --------Desativar ------------------- Sair da operação do objeto;
TimerExitKey = true;
CodConduzivel.Ativo = false;
transform.position = PontoDeSaida.position;
transform.rotation = Quaternion.Euler (0, PontoDeSaida.eulerAngles.y, 0);
}
} else { // se o jogador estiver fora do objeto;
if (CodConduzivel != null) {
CodConduzivel.codPlayer = gameObject.GetComponent<Conduzir> ();
// -------------------Ocupar objeto --------------
CodConduzivel.Ocupado = true;
CodConduzivel.Validado = true;
BotaoAcao.SetActive (false);
}
}
}
if (Utilizando == true) { /// validação antes da utilização
if (Validado == true) { /// evita bugs com mais de 1 player interagindo
if (TimerEnterKey == false) {
CodConduzivel.Validado = false;
GetComponent<Status> ().Ocuado = true;
// / ---- ajustar posição para entrar apos validação
AjustedPosition = true;
TimerEnterKey = true;
// Desativar componentes
gameObject.GetComponent<Player> ().enabled = false;
gameObject.GetComponent<Escorregar> ().enabled = false;
gameObject.GetComponent<Rigidbody> ().isKinematic = true;
CodRotacionar.enabled = false;
}
}
}
// ajustar posição e rotação
if (AjustedPosition == true) {
Quaternion rotFinal = Quaternion.Euler (PontoDeEntrada.eulerAngles.x, PontoDeEntrada.eulerAngles.y, PontoDeEntrada.eulerAngles.z);
Character.rotation = Quaternion.Slerp (Character.rotation, rotFinal, Time.deltaTime * movementSpeed);
transform.position = Vector3.Lerp (transform.position, PontoDeEntrada.position, Time.deltaTime * movementSpeed);
transform.rotation = PontoUtilizavel.rotation;
}
// Timer Enter ------------- tempo de entrada do personagem
if (TimerEnterKey == true) {
TimerEnter += Time.deltaTime;
if (TimerEnter >= TimeToEnter) {
AjustedPosition = false;
TimerEnterKey = false;
TimerEnter = 0;
// Ajustar para posição de Ultilização
transform.position = PontoUtilizavel.position;
Character.rotation = PontoUtilizavel.rotation;
CodConduzivel.Ativo = true;
}
}
// Timer Exit ------------- tempo de Saida do personagem
if (TimerExitKey == true) {
TimerExit += Time.deltaTime;
if (TimerExit >= TimeToExit) {
TimerExitKey = false;
TimerExit = 0;
Desocupar = true; // -------------------desocupar objeto --------------
}
}
if (Desocupar == true) {
Desocupar = false;
// -------------------desocupar objeto --------------
GetComponent<Status> ().Ocuado = false;
Utilizando = false;
CodConduzivel.Ocupado = false;
CodConduzivel.codPlayer = null;
// Reativar Componentes
gameObject.GetComponent<Player> ().enabled = true;
gameObject.GetComponent<Escorregar> ().enabled = true;
gameObject.GetComponent<Rigidbody> ().isKinematic = false;
CodRotacionar.enabled = true;
// --------Desativar ------------------- Desativar objetos;
CodConduzivel.Ativo = false;
ObjetoInteragivel = false;
ObjetoDeInteracao = null;
CodConduzivel = null;
ObjetoTipo = ("Nenhum Objeto");
PontoDeEntrada = null;
PontoDeSaida = null;
PontoUtilizavel = null;
}
}
}
void OnTriggerEnter (Collider otherEnter) {
if (Utilizando == false) {
if (otherEnter.CompareTag ("Conduzivel")) {
///------- detectando ---------------------- obter controles do objeto
ObjetoDeInteracao = otherEnter.gameObject;
ObjetoInteragivel = true;
CodConduzivel = otherEnter.GetComponent<ObjetoConduzivel> ();
ObjetoTipo = CodConduzivel.ObjetoTipo;
TimeToEnter = CodConduzivel.TimeToEnter;
TimeToExit = CodConduzivel.TimeToExit;
PontoDeEntrada = CodConduzivel.PontoDeEntrada;
PontoDeSaida = CodConduzivel.PontoDeSaida;
PontoUtilizavel = CodConduzivel.PontoUtilizavel;
// printa botão de ação na tela;
BotaoAcao.SetActive (true);
BotaoAcao.GetComponent<TextMesh> ().text = CodConduzivel.AcaoDoObjeto;
}
}
}
void OnTriggerExit (Collider otherExit) {
if (Utilizando == false) {
if (otherExit.gameObject == ObjetoDeInteracao) {
// Saindo da detecção
BotaoAcao.SetActive (false);
ObjetoInteragivel = false;
ObjetoDeInteracao = null;
CodConduzivel = null;
ObjetoTipo = ("Nenhum Objeto");
PontoDeEntrada = null;
PontoDeSaida = null;
PontoUtilizavel = null;
}
}
}
}
esse segundo codigo é o que fica no veiculo, ele é so pra pasar as condiçoes que o veiculo se apresenta se esta ocupado o nome dele oque ele faz, vai servir pra fazer aquelas metralhadoras que ficam fixas em algum lugar tambem sabe kkk
- Código:
using UnityEngine;
using System.Collections;
public class ObjetoConduzivel : MonoBehaviour {
[Header ("Parametros")]
public string ObjetoTipo;
public string AcaoDoObjeto;
public Transform PontoDeEntrada, PontoDeSaida, PontoUtilizavel;
public Conduzir codPlayer;
[Header ("Controles")]
[Header ("Se o objeto for do tipo utilizavel")]
public bool Utilizavel;
[Header ("Timer Interação")]
[Range(0,3)]
public float TimeToEnter = 1;
[Range(0,3)]
public float TimeToExit = 1;
[Header ("Monitor")]
public bool Ativo;
public bool Validado;
public bool Ocupado;
public GameObject ObjetoAtivo;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
gameObject.GetComponent<BoxCollider> ().enabled = (!Ocupado);
//reenvia informaçoes do jogador utilizador de volta para o jogador
if (codPlayer != null) {
codPlayer.Utilizando = Ocupado;
codPlayer.Validado = Validado;
}
ObjetoAtivo.SetActive (Ativo);
}
}
Yuri Heinz- Avançado
- PONTOS : 3615
REPUTAÇÃO : 38
Idade : 28
Respeito as regras :
Tópicos semelhantes
» [TUTORIAL] Acessar variáveis de outros scripts, variáveis estáticas (javaScript)
» [DÚVIDA]MULTIPLAYER Unet: Como sincronizar Variaveis(bool)
» [TUTORIAL]C# 1 variáveis.
» [TUTORIAL] Explicação básica de váriaveis
» [TUTORIAL] Como criar um HUD MULTIPLAYER personalizavel
» [DÚVIDA]MULTIPLAYER Unet: Como sincronizar Variaveis(bool)
» [TUTORIAL]C# 1 variáveis.
» [TUTORIAL] Explicação básica de váriaveis
» [TUTORIAL] Como criar um HUD MULTIPLAYER personalizavel
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos