Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Javierhakerone en Diciembre 15, 2018, 05:18:36 AM

Título: sprite en network salen negro
Publicado por: Javierhakerone en Diciembre 15, 2018, 05:18:36 AM
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
Título: sprite en network salen negro
Publicado por: juanma_teso en Diciembre 15, 2018, 12:05:09 PM
Más info estaría bien, cambias de colores los sprites por código? O cargas el sprite con el color definido?
Título: sprite en network salen negro
Publicado por: Javierhakerone en Diciembre 16, 2018, 01:19:53 AM
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
Título: sprite en network salen negro
Publicado por: debug en Diciembre 16, 2018, 02:25:08 PM

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

 
No le estás pasando la instancia a ColorSprite...
Título: sprite en network salen negro
Publicado por: Javierhakerone en Diciembre 17, 2018, 05:28:40 AM
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... 
Título: sprite en network salen negro
Publicado por: juanma_teso en Diciembre 17, 2018, 02:05:50 PM
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).
Título: sprite en network salen negro
Publicado por: Javierhakerone en Diciembre 17, 2018, 07:54:02 PM
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...
Título: sprite en network salen negro
Publicado por: juanma_teso en Diciembre 18, 2018, 12:56:19 AM
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 (https://docs.unity3d.com/Manual/UNetCustomSpawning.html).
 
Lo más sencillo será que llames el NetworkServer.Spawn y luego una función (ClientRPC (https://docs.unity3d.com/ScriptReference/Networking.ClientRpcAttribute.html)) para poner el color y escala que quieras, lo que ya no estoy tan seguro es si estará bien sincronizado.