Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

sprite en network salen negro

Iniciado por Javierhakerone, Diciembre 15, 2018, 05:18:36 AM

Tema anterior - Siguiente tema
Saludos
 
 
 
Tengo una duda, estoy haciendo un juego multijugador 2D y el problema que tengo es que los sprite en los client me salen negros mientras que en el host si salen de colores...
 
explicando un poco mejor, por motivos autodidactas estoy haciendo una replica de agar.io y al host generar los minerales salen de colores pero los client los ven todos negros, noc porque ocurre esto...
 
me dicen si necesitan una inf mas detallada, gracias de antemano

Más info estaría bien, cambias de colores los sprites por código? O cargas el sprite con el color definido?

Gracias por responder juanma_teso...
 
los sprite que estoy usando no son mas que un circulo para el Player y unos diamentes para los minerales esas 2 formas de unity

los colores los cambio por codigo para mantener un solo sprite, el codigo es el siguiente
 
 
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class GeneMinerales : NetworkBehaviour {
 
public int CantMineral, CantMineralMax, NColor = 0;
public GameObject Mineral;
// Use this for initialization
void Start () {
   
}

// Update is called once per frame
void Update () {
   if (!isServer)
      return;
   if (CantMineral < CantMineralMax)
   {
      GameObject minerales = Instantiate (Mineral, new Vector3 (Random.Range (100, -100), Random.Range (100, -100)), transform.rotation);
      ColorSprite ();
      NetworkServer.Spawn(minerales);
      CantMineral += 1;
   }
}
void ColorSprite ()
{
   if (NColor == 0)
   {
      Mineral.GetComponent<SpriteRenderer> ().color = Color.black;
      NColor += 1;
      return;
   }
   if (NColor == 1)
   {
      Mineral.GetComponent<SpriteRenderer> ().color = Color.white;
      NColor += 1;
      return;
   }
   if (NColor == 2)
   {
      Mineral.GetComponent<SpriteRenderer> ().color = Color.cyan;
      NColor += 1;
      return;
   }
   if (NColor == 3)
   {
      Mineral.GetComponent<SpriteRenderer> ().color = Color.magenta;
      NColor += 1;
      return;
   }
   if (NColor == 4)
   {
      Mineral.GetComponent<SpriteRenderer> ().color = Color.yellow;
      NColor += 1;
      return;
   }
   if (NColor == 5)
   {
      Mineral.GetComponent<SpriteRenderer> ().color = Color.red;
      NColor += 1;
      return;
   }
   if (NColor == 6)
   {
      Mineral.GetComponent<SpriteRenderer> ().color = Color.green;
      NColor += 1;
      return;
   }
   if (NColor == 7)
   {
      Mineral.GetComponent<SpriteRenderer> ().color = Color.blue;
      NColor += 1;
      return;
   }
   if (NColor > 7)
   {
      NColor = 0;
   }
}
 
}

 
 
 
En el Host se ven de colores los minerales pero en el Client los minerales se ven negros todos


....................
      ColorSprite (minerales);
      NetworkServer.Spawn(minerales);
      CantMineral += 1;
   }
}
void ColorSprite (GameObject Mineral)
{
...................

 
No le estás pasando la instancia a ColorSprite...

Cita de: debug date=1544966708

....................
      ColorSprite (minerales);
      NetworkServer.Spawn(minerales);
      CantMineral += 1;
   }
}
void ColorSprite (GameObject Mineral)
{
...................

   
      No le estás pasando la instancia a ColorSprite...
   


Hago esto y no cambia nada... 

A ver, creo que el NetworkServer.Spawn lo que hace es una instancia del prefab registrado en el cliente y luego inicia las variables "syncvar", por eso cuando cambias el color del prefab en el servidor el cliente no se entera (no crea una copia en el cliente), si no llamas la función donde cambias el color del prefab (ColorSprite()) en el servidor se instancia negro? Si es así puedes hacer lo siguiente:
 
Función custom de Spawn, sería lo más complicado/sofisticado, creas una función que será la que se use en los clientes (y en el host) cuando se instancie el prefab.
 
Cambiar el color después de instanciar el prefab, instancias el prefab y luego llamas un ClientRPC con el color que quieras.
 
Crear una variable "syncvar" que se iniciará con el valor que tenga en el servidor en el momento de llamar el Spawn,
 
Ahora bien. no recuerdo si "Color" sea un tipo que puedas pasar o hacer variable, sino puedes usar un simple Vector3 (o Vector4 si usas el alpha del color).

Cita de: juanma_teso date=1545051950Función custom de Spawn, sería lo más complicado/sofisticado, creas una función que será la que se use en los clientes (y en el host) cuando se instancie el prefab.
   
   
      Cambiar el color después de instanciar el prefab, instancias el prefab y luego llamas un ClientRPC con el color que quieras.
   
   
      Crear una variable "syncvar" que se iniciará con el valor que tenga en el servidor en el momento de llamar el Spawn,
   
   
      Ahora bien. no recuerdo si "Color" sea un tipo que puedas pasar o hacer variable, sino puedes usar un simple Vector3 (o Vector4 si usas el alpha del color).
   


Gracias por responder, Soy nuevo en esto asi que esto no lo entiendo del todo bien...
 
Cita de: juanma_teso date=1545051950A ver, creo que el NetworkServer.Spawn lo que hace es una instancia del prefab registrado en el cliente y luego inicia las variables "syncvar", por eso cuando cambias el color del prefab en el servidor el cliente no se entera (no crea una copia en el cliente)
   


Y como puedo hacer para que el servidor sea quien cree la instancia y se replique en los client? tanto el color como el tamaño? hay otra forma?
 
 
 
Podría tratar que se instancie un "Mineral" diferente ya con su color predefinido pero creo que no sería lo correcto tener varios prefab del mismo objeto cuando puedo cambiar su color por código...
 
 
 
De momento buscare formas de instanciar diferentes a ver que consigo...

Cita de: Javierhakerone date=1545072842Y como puedo hacer para que el servidor sea quien cree la instancia y se replique en los client? tanto el color como el tamaño? hay otra forma? 
   


Con el CustomSpawn.
 
Lo más sencillo será que llames el NetworkServer.Spawn y luego una función (ClientRPC) para poner el color y escala que quieras, lo que ya no estoy tan seguro es si estará bien sincronizado.

Etiquetas: