Noticias

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

Camara

Iniciado por lolo3078, Mayo 18, 2017, 02:24:12 PM

Tema anterior - Siguiente tema
Hola, tengo un problema estoy haciendo un juego multijugador con Unity3D, pero el problema es que cuando 2 jugadores entran, 1 jugador tiene su propia camara y se puede mover y girar su camara, y etc.... Pero el otro jugador se puede mover, pero no tiene su propia camara, es decir mira por la camara del otro.
 
Alguno me podria decir como arreglar esto, o mandarme el script que tengo que poner o algo así, estoy desesperado ;-;
 
Saludos.
 
Lolo.

¿Qué tipo de multijugador es: Local o Remoto(LAN/Online) ?
 

  •    Local. Típica pantalla partida para los jugadores o una cámara global que enfoque a ambos a la vez en el escenario.


  •    Remoto: Típico juego online en el que cada jugador tiene su propio personaje y cámara...


En el caso del remoto, lo más normal es crear un prefab o plantilla de todas las cosas que llevará un jugador cliente (pivote de cámara, scripts de control, personajes, etc), y luego, en cada cliente, generar y asignar una cámara a su correspondiente pivote. Es importante que el código de la cámara sea modular y adaptable a cualquier cliente que se conecte.
 
 
 
En el caso del remoto, tienes que crear 2 ó más cámaras físicas, obviamente, y colocarlas según tus preferencias...

Mayo 18, 2017, 07:01:28 PM #2 Ultima modificación: Mayo 18, 2017, 07:03:01 PM por lolo3078
Es un juego online (LAN), tipo de estos juegos como Slendytubbies, survivors y etc, en los que se usa Hamachi para conectarse a tu amigo xD, pero el problema es que yo tengo puesto los personajes en primera persona, y cuando se conectan 2 a la vez, uno se mueve y tiene su propia camara y puede girarse y demás, pero el otro, no tiene su propia camara, sino que ve lo que ve la otra persona, pero si se puede mover, pero los jugadores no tienen propias camaras para mirar, si no ke miran todos por la misma camara de un jugador.
 
 
 
Es decir, lo que quiero hacer es que cada jugador tenga su propia camara, pero no se si tengo ke poner un codigo o algo para  hacer eso xD, si fuera un codigo, porfavor si lo sabeis y podeis mandarlo lo agradeceria mucho, o explicarme lo ke tengo que hacer y ya lo hago yo jejeje.
 
 
 
Saludos.
 
Lolo.
 
Problema resuelto, ya esta, pero ahora tengo otro problema:
 
Cuando se conectan 2, al moverse 1 el otro tambien se mueve, pero si tu vas al juego de la otra persona tu no ves que te estes moviendo xD, alguien me puede decir como hago para que solo muevas tu personaje y no los otros xD, saludos, Lolo.

Cuando instancias el objeto del jugador, si estas usando el mismo script este debe tener alguna variable booleana que especifique si lo controla el jugador.
 
Es decir en el script donde se especifica el movimiento del jugador debería haber un:
 

public bool controlJugador = false;
void Update()
{
if(!controlJugador)
return;
 // -- Movimiento --
 //      ----  
 //      ----
}

 
Luego al instanciar el objeto que creas para el jugador, deberás pasarle a controlJugador = true, cuando se trate del objeto que quieres que mueva.

El problema es que estas intentando desarrollar algo que requiere de un conocimiento mucho más elevado del que dispones, ya lo comente en varios topics, el apartado Networking requiere de mucho conocimiento y para lograr algo decente te voy a dar los puntos más necesarios.
 
1º - Programacion de Socket - Entender el funcionamiento de UDP y TCP.
 
2º - Tratado de datos, Serialización y Compresión.
 
3º - Sistemas centralizados.
 
4º - Base de datos o estructuras como XML o JSON.
 
¿Por qué todo esto es importante?
 
La programacion de un juego en red es algo de lo más complicado que existe, no por el hecho de enviar una posición y predecir, esto es lo más simple, los sistemas se vuelven complejo cuando se trata de sincronizar los estados de múltiples objetos, implementacion de múltiples sockets para evitar los cuellos de botella por los AKC en datos importantes. Para todo esto existen técnicas , como ZoneSync, ChunkSync y varias más.
 
Por esta simple razón resumida a lo bruto te diría que comprendas cómo van las cosas.
 
 
 
Ahora, ¿Cuál es tu problema puntualmente?
 
No estas distinguiendo entre un entorno local y el servidor, cada instancia del juego es un entorno local, aunque estés conectado a un servidor sigue siendo totalmente local, quiere decir que, podes mover otros jugadores, destruirlos, etc, por esta razón en juegos de la actualizad aun se pueden usar hacks como Auto-aim, wall hack, fly, etc.
 
¿Por que la cámara del o los jugadores que se conectan después del primero no funciona?
 
Lógicamente no funcionan por que en tu instancia local existe ya un "Game Object (Player)" que contiene un cámara en X layer, supongamos 1 y cuando se crea tu instancia tambien contiene una cámara con las mismas configuraciones por lo que Unity no renderiza con dicha cámara, porque no detectó cambio alguno.
 
Lo mismo sucede con los movimientos, primero tienes que estar seguro de que estas moviendo tu propia instancia, en networking es muy utilizado el "IsMine", que en UNET es equivalente a isLocalPlayer, entonces deberias de procesar todos los inputs con la condición de isLocalPlayer. Aca vienen problemas de diseño, de lógica y un millón de temas para hablar que no van al caso.
 
... CÓDIGO ... 
 
Game Input... Cuando se conecta a un servidor se deben setear las dos variables, si no se conecta a un servidor entonces se pueden utilizar normalmente para el juego OffLine.
 

public class GameInput : MonoBehaviour
{
public static bool isLocalPlayer = false;
public static bool isNetwork = false;
public bool Press(KeyCode key)
{
   return (isNetwork && isLocalPlayer)? Input.GetKey(key) : false;
   return Input.GetKey(key);
}
}

 
Jugador.
 

public class Player : MonoBehaviour
{
private void Update()
    {
   if(GameInput.Press(KeyCode.W))
        {
      transform.Translate(transform.forward * 5 * Time.deltaTime);
   }
    }
}

 
 
 
Te dejo mi blog donde explico un poco de esto...
 
http://unitydoc.blogspot.com.ar/

Jejeje, problema solucionado, grácias por el bloc :)

Etiquetas: