Tienes un problema de Sincronizaciones, es decir, el nombre del host se encuentra dentro del servidor, por eso mismo este está actualizado en todas las instancias, el problema reside cuando los jugadores se conectan, seguramente no le están enviando estos datos al servidor, por lo tanto, ni el servidor ni otras instancias conocen tu nombre.El Networking es algo sumamente complejo cuando no tienes mucho conocimiento, si estás recién comenzando te propongo visitar un Canal en YT para seguir tutoriales, yo mismo he hecho varios, hasta de UNET.Ten en cuenta, que esta y otras prácticas son altamente complejas!
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
#602
General (Antiguo) / Problema con el Screen.resolution
Febrero 25, 2016, 09:28:10 PM
Tenes que fijarte en las opciones del Canvas, existe una manera (http://docs.unity3d.com/Manual/script-CanvasScaler.html) de resolver estos problemas de múltiples resoluciones y aspec ratio, te recomiendo siempre utilizar la resolución mas alta que tu juego dispondrá, ya que esta función esta hecha para funcionar de esa manera.
#603
General (Antiguo) / Necesito ayuda con un fps multiplayer
Febrero 20, 2016, 03:40:58 PM
Existen varias técnicas, primero tendrías que analizar si tu problema se genera por falta de conocimiento sobre Cinemática inversa, o es una simple aplicación de la cámara.Si lo que necesitas es que Tanto el Brazo como el Arma lo veas centrado en la cámara, primero deberás crear una cámara que renderize solo el arma y brazos, luego buscar la mejor posición y conjunta con tu cámara FPS lograr el resultado deseado.Call Of Duty Utilizo esta técnica siempre, mas que nada para resolver el problema que el Arma atraviesa la Pared.Para el resto es ingenio o genio, como quieras, podría tratarse de AIM IK u otro sistema mas simple, como Animaciones..
#604
General (Antiguo) / Choque entre Rigidbody
Febrero 18, 2016, 10:58:21 PM
En tu caso al estar aplicando la fuerza en una escala de tiempo muy baja deberias superar los valores de 500 o mas para que tenga efecto.
#605
General (Antiguo) / P4 - UNET [Networking] - Disparos
Febrero 18, 2016, 08:39:25 PM
[quote author=Arthure" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35164" data-ipsquote-contentcommentid="127225">Buenas http://unityspain.com/profile/18127-francoe1/?do=hovercard" data-ipshover="" href="<___base_url___>/profile/18127-francoe1/">@francoe1Tengo una pequeña duda, aunque antes de exponerla tengo que aclarar que nunca he realizado ningun intento con UNET por lo que se entiende que tampoco he probado tu codigo ... dicho eso, mi duda es si cuando realizas un tutorial compruebas que funciona; no es como critica, solo lo digo porque hay cosas que me chocan en ese codigo que a continuacion paso a nombrarte :Lo primero que me ha llamado la atencion es la clase health que hereda de Player ... aunque de entrada esto no deberia provocar ningun error, tampoco tiene mucho sentido (por no decir ningun sentido). La herencia se debe utilizar cuando es necesario hacer un subgrupo perteneciente a una clase para que tenga sus propios atributos y funciones, y en este caso quiero entender (o asi seria lo logico) que el contenido de la clase health sera comun a todos los objetos de la clase Player sin excepciones a no ser que existan jugadores sin vida. Ademas, aunque como digo no deberia provocar ningun error de entrada ... si que podrian darse situaciones en que provocase errores.Lo segundo que me ha llamado la atencion si que deberia provocar un error grave siempre y se encuentra en la funcion Cmd_TakeDamage. La primera accion que realiza esa funcion es buscar un objeto mediante un ID que siempre devolvera un objeto de tipo Player, y en caso de que este no sea nulo deberia pretender restarle X puntos de vida ... pero en este punto, si no estoy muy equivocado se supone que saltara error :
- En primer lugar intentas acceder a la funcion HealtTake mediante otherp.healt.HealtTake (siendo otherp siempre un objeto de tipo Player). El problema es que healt no es una propiedad de Player, si no una clase que hereda de Player que es muy distinto.
- En segundo lugar, aunque se intentara acceder a la funcion de HealTake directamente desde el objeto otherp (porque la clase healt es tambien de la clase Player) se produciria una de las posibles situaciones de error que comentaba en el primer punto ... cuando se trabaja con herencia de clases, puedes acceder a las propiedades y funciones de la clase base (siempre que estas sean public o protected), pero no a la inversa. Dicho de otra manera, desde un objeto de la clase healt podras acceder a las funciones de la clase Player pero no sucede lo mismo a la inversa.
#606
General (Antiguo) / Ayuda urgente con publicidad iAd
Febrero 16, 2016, 11:40:08 PM
Si no lo puedes resolver avísame y trataremos de solucionarlo, ya que estoy por experimentar con iOS y seguramente tendré las mismas trabas!
#607
General (Antiguo) / Ayuda urgente con publicidad iAd
Febrero 16, 2016, 11:24:09 PM
Una simple recomendación, cuando estas trabajando con Apple y estos te rechazan una o dos veces un proyecto por no cumplir con las normas debes tener cuidado, ya que podrán darte de baja.¿por que no utilizas otras campañas publicitarias?, ¿Tienes dos sistemas publicitarios en la aplicación?, ¿has intentado publicar sin iAd?Por lo que el mensaje da a entender es que estas utilizando una librería con partes de código que no tiene soporte en tal plataforma, también indica un error con el identificador como diciendo que no tienes la función activada. Y lo que da mas abajo ya lo veo un poco complejo, también deberías disponer de un MAC para realizar los pasos.Intenta, desde mi ignorancia...Subir la aplicación sin el Pluglins.
Borrar todos los Datos de anteriores compilaciones y volver a subir con el Plugin activado..
Borrar todos los Datos de anteriores compilaciones y volver a subir con el Plugin activado..
#608
General (Antiguo) / Problema con el Screen.resolution
Febrero 16, 2016, 11:04:16 PM
¿Estas trabajando sobre Windows?Hace un tiempo tuve un problema similar, si encuentro como lo resolví te paso la referencia, pero era una tontería!..
#609
General (Antiguo) / P4 - UNET [Networking] - Disparos
Febrero 16, 2016, 10:50:42 PM
Bienvenidos a la cuarta entrega de UNET.En esta tratare de cubrir lo necesario para efectuar un disparo, como vimos en anteriores tutoriales logramos un movimiento, sincronizacion y sistema de salud funcional, aun que no de la mejor manera.En este tutorial vamos a necesitar utilizar Commandos.Bueno vamos al grano, para empezar debemos crear nuestro componente PlayerWeapon(Opcional), cabe destacar que cada juego tiene un GAME PLAY propio por lo tanto obviamos como funcionan los aspectos del mismo.
Para poder enviar un dato, como lo necesitamos en este momento, el impacto de la bala con nuestro enemigo debemos tener los datos de nuestro enemigo, una forma muy simple de poder interactuar con otro jugadores es obteniendo su ID de red. Suponiendo que tenemos nuestro sistema de Armas con el método Raycast ya listo, nos daremos cuenta que siempre obtenemos un dato de las colisiones para frente a este seguir diferentes acciones. EJ:
Para poder enviar un dato, como lo necesitamos en este momento, el impacto de la bala con nuestro enemigo debemos tener los datos de nuestro enemigo, una forma muy simple de poder interactuar con otro jugadores es obteniendo su ID de red. Suponiendo que tenemos nuestro sistema de Armas con el método Raycast ya listo, nos daremos cuenta que siempre obtenemos un dato de las colisiones para frente a este seguir diferentes acciones. EJ:
private void Shot()Por lo genera siempre es de esta manera, bueno cuando trabajamos con networking se sigue haciendo del mismo modo. y el dato que tomamos el el ID a este lo enviamos por comando, y el servidor se encarga de aplicarle el daño en este caso.
{
Ray = Camera.Look;
RaycastHit Hit;
if(Raycast out Hit)
{
if(Hit == "Enemy")
{
Ejecuta Accion
}
}
}
public void Shot()De esta simple manera tendríamos ya nuestro sistema de disparo funcionando, ahora deberíamos mejorarlo para que funcione aun mejor. !Importante¡Cuando se trata de la programación de videojuegos o aplicaciones en red uno de los temas mas importantes son los de Seguridad, cuando se trabaja con dinero real este punto se refuerza con personal altamente calificado y experimentado, quiero decir que si la idea que tienes es crear un juego Online estilo AVA u otro MFPS y aun no tienes el personal y la experiencia necesaria, entonces no lo intentes. Esta serie de Información y Tutorial es solo para lograr juegos en red simple, para poder compartir con amigos o mejor aun un simple sistema networking donde la vulnerabilidad no se un problema grave.Bueno gente, como les prometí esta es la cuarte entrega, no es el material mas detallado pero se pueden dar cuanta de la fácil implementacion que UNET nos presta en su librería de Alto Nivel para networking. Mi idea es que si alguien necesita algo mas detallado solo comente y explicare paso por paso como lograr. obvio si es que entiendo lo que necesite.No olviden visitar mi Blog!Un abrazo -. Franco
{
Codigo de Disparo por RayCast, tomamos el net id y lo enviamos por commando
Cmd_TakeDamage(hit.NetID); //EJEMPLO
}
[Command]
private void Cmd_TakeDamage(uint PlayerTake, int Damage)
{
//buscamos los jugadores que corresponden al ID,con una simple funcion
var otherp = FindPlayer(PlayerTake);
if(otherp != null)
{
//llamamos la funcion de Take!
otherp.playerHealt.HealtTake(50);
}
}
private void FindPlayer(uint ID)
{
foreach(var p in GameObject.FindObjectsOfType<PlayerControl>())
{
if(p.netId.Value = ID)
{
return p;
}
}
return null;
}
public class PlayerControl : NetworkBehaviuor
{
public PlayerHealt playerHealt;
public override void OnStartClient()
{
playerHealt = GetComponent<PlayerHealt>();
}
}
public class PlayerHealt : NetworkBehaviuor
{
[SyncVar]
int current = 100;
[Server]
internal void HealtTake(int value)
{
current -= value;
}
}
#610
General (Antiguo) / P3 - UNET [Networking] - Sistema de Salud
Febrero 04, 2016, 06:53:18 PM
Bienvenidos a otro tutorial de UNET.Como vimos en anteriores tutoriales, para poder sincronizar una variable en nuestro jugador locas debemos primero asignarla y luego enviar ese valor al servidor. EJ : (P-Local) Cambió su posicion --(Envia a traves de comando su nueva posicion al servidor)--> (SERVER) El servidor recibe estos datos y los envía a todos los Clientes.
Teniendo esto en cuenta, para lograr un Sistema de Salud funcional debemos primero tener el valor de la salud actual, un evento que se llame cuando muere, 2 funciones una de daño y la otra de recuperación, y por ultimo el comando para enviar el estado de nuestra salud.Vemos... Primero creamos lo básico.
de esta manera optimizamos el paquete, ya que solo enviamos un dato.
Bueno eso es todo por ahora, espero les sirva. Para tener un poco más organizados mis tutoriales abrí un Blogger donde encontraran todo mi material y podrán seguir mis tutoriales de UNET.http://unitydoc.blogspot.com.ar/">http://unitydoc.blogspot.com.ar/Saludos
Teniendo esto en cuenta, para lograr un Sistema de Salud funcional debemos primero tener el valor de la salud actual, un evento que se llame cuando muere, 2 funciones una de daño y la otra de recuperación, y por ultimo el comando para enviar el estado de nuestra salud.Vemos... Primero creamos lo básico.
public const int MaxHealt = 100;bien con esto ya tendríamos nuestro Sistema de salud casi terminado, pero debemos tener algunas cosas en cuenta.
[SyncVar]
public int Healt;
public delegate void d_Death();
[SyncEvent]
public event d_Death EventDeath;
[Client]
public void TakeDamage(int value)
{
Healt -= value;
Healt = Mathf.Clamp(Healt,0,MaxHealt);
}
[Client]
public void TakeCure(int value)
{
Healt += value;
Healt = Mathf.Clamp(Healt,0,MaxHealt);
}
- Jamás un jugador va a poder infringir directamente daño a otro, de esto se encarga el servidor, pero existe una problemática, cuando nosotros ejecutamos un disparo, este evento es gestionado por el servidor, entonces es el Servidor en nombre de X Cliente dueño del disparo, supongamos que este impacta con otro jugador, ¿Quien resta la salud?, La respuesta es el Servidor. Es decir, si nosotros llamamos una funciona cualquiera desde un comando estamos haciéndolo en nombre del servidor.
(CLIENTE) ---> Ejecuta ---> COMMAND ---> (SERVIDOR) ---> Ejecuta Funcion ---> TakeDamage();
- Dicho lo anterior, podremos darnos cuanta de que no existe interacción Cliente/Cliente por lo que esto se denomina Cliente/Servidor. ¿Cual es realmente la problemática?, Aunque existan varios problemas relacionados solo con un sistema de salud, deberíamos destacar el mas importante. El Jugador local solo debe enviar su estado, no hay que confundir, es decir, el servidor no se debe de encargar de procesar si está muerto o no, para eso creamos nuestro sistema. Vi muchos errores a la hora de implementar funciones incoherentes, por ejemplo, que todos los jugadores comprueben si la salud es menor o igual a cero entonces esta muerto.
void Update()
Esto es un grave error, porque los tiempos de sincronización pueden variar según el Ping (Tiempo de Envío y Recibo de Datos) que el Cliente y servidor tengan. vamos a dar un Ejemplo:
{
if(Healt <= 0)
{
IsDeath = true;
}
}
Tenemos 4 Clientes en un servidor, Cliente 1 dispara y le quita 100 de salud al Cliente 2 Esta acción tomó un tiempo de.
1- Cliente 1 (Enviar Datos del disparo al Servidor y Retornar Resultados) : 2s
2- Cliente 2 (Recibe la noticia de que se le a impactado, el servidor llama a su función TakeDamage(), luego, el Cliente 2 envía los dato de su estado al Servidor) : 4s
3- Clientes (Servidor Actualiza el Estado del Cliente 1 en todas las instancias del juego, diciendo que el valor de Healt es cero) 1s
Vemos que en el Punto 1 el Cliente 1 ya sabe que le infligió daño al Cliente 2, pero aun el Cliente 2 no se enteró, suponiendo que el primer paso Duro solo 1s, ya que el segundo añadido es el tiempo que el Servidor tardó en enviar esa información al Cliente 1, el Cliente 2, por lo tanto recibe daño, y envía el valor de Healt al servidor, 4s + 1s que el servidor toma para enviar los datos de este evento al Cliente 3, 4 es el retardo que existiría, suponiendo así, que cada instancia debería comprobar aún si el Cliente 2 está vivo, pero qué pasa si en ese lapso de 4 segundo el Cliente 2 sobrevive, es decir, un ejemplo, lo reviven estilo BF, el Cliente 1,3,4 tendrían una mala información. en destiempo. - Aunque el ejemplo en cierta forma parece no tener coherencia el problema se presenta cuando múltiples clientes con distintos tiempos de respuestas se conectan al servidor, este error puede llegar a hacernos ver el jugador muerto disparando.
[SyncVar]De esta manera estamos enviando de una manera, quizas un poco desprolija nuestra información al servidor, pero si prestaron atención en la función Update, se agregó un condicional para saber si es el jugador local, ya que solo él, podrá gestionar su salud y avisar al servidor su estado.Hay que entender, que aunque Unet Serialize nuestros datos y los optimice podemos ayudar también nosotros, a que esta tarea sea aun mas optima, por ejemplo enviando un string formateado de una manera para guardar el valor de nuestras variables.
internal bool IsDeath;
[SyncEvent]
public event d_Death EventDeath;
void Update()
{
if(!isLocalPlayer)return;
if(Healt <= 0 && !IsDeath)
{
IsDeath = true;
if(EventDeath != null)EventDeath();
Cmd_SendInfo(Healt,IsDeath);
}
}
[Command]
private void Cmd_SendInfo(int healt, bool isDeath)
{
Healt = healt;
IsDeath = isDeath;
if(IsDeath)if(EventDeath != null)EventDeath();
}
string Data = "100/0";
[Command]
private void Cmd_SendInfo(string data)
{
string[] values = data.Split('/');
Healt = int.Parse(values[0]);
IsDeath = int.Parse(values[1])? false : true;
Data = data;
}
de esta manera optimizamos el paquete, ya que solo enviamos un dato.
Bueno eso es todo por ahora, espero les sirva. Para tener un poco más organizados mis tutoriales abrí un Blogger donde encontraran todo mi material y podrán seguir mis tutoriales de UNET.http://unitydoc.blogspot.com.ar/">http://unitydoc.blogspot.com.ar/Saludos
#611
General (Antiguo) / A* para unity en 2d
Febrero 04, 2016, 05:56:24 PM
La idea de Braltor es una alternativa muy rápida de cómo implementar, y creo la única más aceptable. Pero en tu caso, si aun necesitas crear un Pathfinder para utilizar en una grilla del juego te recomendaría que aprendas Tile Map
#612
General (Antiguo) / The Room 51
Febrero 03, 2016, 05:24:25 PM
Me gusto muchisimo, suerte con el desarrollo, ¡espero avances!
-Lograste la escena, los movimientos y la dinámica del juego de una manera muy natural.
-Trata de poner un poco de música, y sacar la respiración del personaje, o hacerla un poco más suave, porque eso me molesto bastante, aunque debería ver como afecta esto en el GamePlay para saber realmente si es tan molesto.Saludos -.
-Lograste la escena, los movimientos y la dinámica del juego de una manera muy natural.
-Trata de poner un poco de música, y sacar la respiración del personaje, o hacerla un poco más suave, porque eso me molesto bastante, aunque debería ver como afecta esto en el GamePlay para saber realmente si es tan molesto.Saludos -.
#613
General (Antiguo) / A* para unity en 2d
Febrero 03, 2016, 05:16:05 PM
¿Podrías utilizar NavMesh?, De lo contrario, el juegos, ¿es Top View?, si es así, entonces trata de implementar un sistema de pathfinder, recuerda que este sistema te sirve cuando trabajas sobre Grillas, ya que es mas optimo que el NavMesh, aunque podrias tambien implementarlo sobre cualquier otra situación.El Algoritmo de busqueda no es algo muy dificil de entender, pero si es un poco complicado llegar a optimizarlo, deberás saber, Staks, BinaryTree, y otras estructuras complejas. Si estas empezando en la programacion te recomendaria que adaptes tu proyecto para utilizar NavMesh, y no pierdas tiempo con Algoritmos que aun pueden ser muy difíciles de aplicar correctamente, en resumen, entender el funcionamiento es simple, lograr un resultado óptimo es dificil.Quizas un dia de estos cuando termine con los Topic de UNET escriba un Topic sobre Pathfinding.Saludos. PD: si estas aun un poco interesado te dejo un buen material para leerhttp://www.cristalab.com/tutoriales/algoritmo-a-para-encontrar-el-camino-mas-corto-en-ia-c91591l/" rel="external nofollow">http://www.cristalab.com/tutoriales/algoritmo-a-para-encontrar-el-camino-mas-corto-en-ia-c91591l/http://jsbsan.blogspot.com.es/2012/09/algoritmo-estrella-usandolo-en-gambas3.html" rel="external nofollow">http://jsbsan.blogspot.com.es/2012/09/algoritmo-estrella-usandolo-en-gambas3.htmlhttps://escarbandocodigo.wordpress.com/2011/07/11/1051/" rel="external nofollow">https://escarbandocodigo.wordpress.com/2011/07/11/1051/En youtube también existen muchos videos donde te explican como programarlo, y no como funcionan.
#614
General (Antiguo) / Editor de Niveles
Febrero 02, 2016, 06:08:05 PM
1 - Aprende UI
2 - ScreenRayCast to WorldPosition
3 - ProgramarEs muy facil, con esas tres referencias podrias date una idea de como hacerlo.
2 - ScreenRayCast to WorldPosition
3 - ProgramarEs muy facil, con esas tres referencias podrias date una idea de como hacerlo.
#615
General (Antiguo) / [Ayuda]Problema con Animacion siempre vuelve al mismo lugar
Febrero 02, 2016, 03:59:33 PM
Puede ocasionarse por dos Factores, estas cambiando la posición del Root cuando animas, o no estas utilizando RootMotion.En esta situación diría que deberías ver como funciona RootMotion. Suerte!