Noticias

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

problemas con online

Iniciado por zopas tv, Noviembre 15, 2017, 07:53:29 PM

Tema anterior - Siguiente tema
Noviembre 15, 2017, 07:53:29 PM Ultima modificación: Noviembre 16, 2017, 05:40:50 PM por pioj
hola a todos, estoy aprendiendo a hacer un juego en red (para saber aplicarlo a otros proyectos) pero tengo varios problemas:
 
1- He utilizado el siguiente codigo para hacer el movimiento online pero ahora en el juego, al ejecutarlo no se mueve el coche (A todo esto,¿tengo que poner el "NetworkBehaviour" y "using UnityEngine.Networking" en todos los script que quiero que funcionen online?)
 

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class movimiento : NetworkBehaviour {

public float VelocidadNormal = 15f;
public GameObject nitro;
// Use this for initialization
void Start () {
   
      
}

// Update is called once per frame
void Update () {
   if (!isLocalPlayer) {
      return;
   }
   float tecladoVertical = Input.GetAxisRaw ("Vertical");
   float posicionZ = transform.position.z + (tecladoVertical * VelocidadNormal * Time.deltaTime);
   transform.position = new Vector3 (transform.position.x, transform.position.y, posicionZ);
   float tecladoHorizontal = Input.GetAxisRaw ("Horizontal");
   float posicionX = transform.position.x + (tecladoHorizontal * VelocidadNormal * Time.deltaTime);
   transform.position = new Vector3 (posicionX, transform.position.y, transform.position.z);
   Nitro ();
   }
 public void Nitro () {
   if (Input.GetButton("Fire1")) {
      VelocidadNormal = 30f;
 
   }      
   if (Input.GetButtonUp ("Fire1")) {
      VelocidadNormal = 10f;
   }
}
}

 
2- al intentar probar el juego en red con build and run me da una serie de errores y no se que esta ocurriendo
 



   
       
   
   
      (1-Failed to find prefab parent for scene object [name:coche]
      UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
   
   
      2-Failed to find prefab parent for scene object [name:coche]
      UnityEngine.Networking.NetworkIdentity:OnValidate()
   
   
      3-Failed to find prefab parent for scene object [name:coche]
      Unit***itor.BuildPlayerWindow:BuildPlayerAndRun()
   
   
      4-Error building Player: Failed to find prefab parent for scene object [name:coche]
   
   
      5-Unit***itor.BuildPlayerWindow+BuildMethodException: 2 errors
        at Unit***itor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (BuildPlayerOptions options) [0x00207] in C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindowBuildMethods.cs:172 
        at Unit***itor.BuildPlayerWindow.CallBuildMethods (Boolean askForBuildLocation, BuildOptions defaultBuildOptions) [0x00050] in C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindowBuildMethods.cs:83 
      Unit***itor.BuildPlayerWindow:BuildPlayerAndRun()
   
   
      6-Failed to find prefab parent for scene object [name:coche]
      UnityEngine.Networking.NetworkIdentity:OnValidate()  ) 
   
   
       
   

[/quote]
 
me podrian decir que significan?? 
 
Gracias

Noviembre 15, 2017, 08:18:18 PM #1 Ultima modificación: Noviembre 15, 2017, 08:19:36 PM por francoe1
Te recomiendo que primero leas la documentación de UNET.
 
En principio tu error está en pensar el cliente como si fuera un híbrido entre un server y cliente cuando no lo es, NetworkManager requiere del prefab de "Player", por recomendación te sugiero que en este caso sea un "Controlador del jugador"..
 
La abstracción para el Multiplayer seria -
 
El juego debe funcionar en modo local en un 100% todas las mecánicas, físicas, etc. aunque el GamePlay se vea afectado por un factor externo en este caso producido por el servidor, en el cliente tienes que tener una forma de "Simularlo".
 
El juego tiene que funcionar perfecto sin estar en multijugador, luego para el multijugador solo tienes que sincronizar Inputs, posiciones y tiempo, con estos 3 valores tienes que inventar tu propio sistema de interpolación para que los escenario de diferentes clientes se vean similares.

eso ultimo no lo acabo de entender
 
Cita de: francoe1 date=1510773498 
   
   
      El juego tiene que funcionar perfecto sin estar en multijugador, luego para el multijugador solo tienes que sincronizar Inputs, posiciones y tiempo, con estos 3 valores tienes que inventar tu propio sistema de interpolación para que los escenario de diferentes clientes se vean similares.
   


 

Primero programa todo el juego de manera "OFFLINE" -
 
Trata de que cada controlador se dependiente del superior, por ejemplo si en tu GamePlay con la Tecla W aceleras entonces haz en tu controlador de vehiculo una funcion Acelerar, y otra para doblar, o incluso unir y hacer una sola función, pero  supongamos que hiciste todo separado.
 

public class VehicleController : MonoBehaviour
{
public void Acelerate(float value){}
public void Brake(){}
public void HandBrake(){}
public void Turn(float angle){}
}

 
Ahora para que esto trabaje de manera "Online" deberias sincronizar los inputs de todos los jugadores más la posición del auto. Para una predicción mucha más precisa podrias sincronizar dirección y velocidad.
 

public class PlayerNetwork : NetworkBehaviour
{
public VehicleController Controller;
private void Update()
{
   if(islocal)
      UpdateInput();
}
private void UpdateInput()
{
   float dir = Inpt....
   float aceleration ...
   Controller.Acelerate(aceleration);
   Controller.Turn(dir);
   Cmd_SendIn***ndPosition(dir, aceleration, Controller.transform.position, Controller.trasnform.rotation);
}

[Command]
private void Cmd_SendIn***ndPosition(float dir, float aceleration ...)
{
   Rpc_ReceiverIn***ndPosition(dir, aceleration);
}

[ClientRPC]
private void Rpc_ReceiverIn***ndPosition(float dir, float aceleration ...)
{
   Controller.Acelerate(aceleration);
   Controller.Turn(dir);
}
}

 
De esta manera podrias hacerlo, logicamente falta muchisimo para que funcione pero esa es la idea principal.

entonces como los sincronizo??
 
entiendo lo que me explicas pero ¿como sincronizo los inputs y todo??

En el ejemplo ya esta como sincronizar los Inputs.
 
Si vas a jugar en Modo Online el vehiculo es controlado por PlayerNetwork - Si vas a jugar en modo local creas un controlador nuevo

Lo que quieres hacer se hace con UNET muy fácil hay un tutoriales en video.
 
https://unity3d.com/es/learn/tutorials/s/multiplayer-networking?_ga=2.35452066.2078746215.1510789047-1078449187.1493931736
 
No trates de hacer todo desde 0, aprovecha las herramientas que te brinda unity y así vas a ahorrar tiempo. 
 
 
 
 

pero si mi problema es que al usa el network y networking no funciona nada

Por eso te digo mira el tutorial, hay te explican todo muy muy bien, mejor de lo que puedo hacer yo, sin embargo es muy probable que tu problema no sea el código, sino que no agregaste los scripts de unet a tus GameObject.
 
Solo los GameObject con el script NetworkIdentity pueden ejecutar scripts de multiplayer. 
 
El tutorial lo haces en 30min o menos es muy recomendado.

vale ya lo tengo, pero al hacer un prefab de mi coche, se dobla en el eje x y no se como soluccionarlo 


una pregunta, tengo scipts hechos de puntuacion, pero al ponerle los scripts a las porterias no va el script
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
public class puntuacion : NetworkBehaviour {
public static int azul = 0;
public Text Azul;
// Use this for initialization
void Start () {
   Azul.text = "Azul: " + puntuacion.azul;
}

void OnTriggerEnter(){
   puntuacion.azul++;
   Azul.text = "Azul: " + puntuacion.azul;
}
}

 
 

Eso nunca va a funcionar NetworkBehaviour no hace magia, tenes que aprender primero a diseñar tu juego de forma local luego intenta el networking -
 
Te paso a explicar -

Si por ejemplo tu juego es de fútbol entonces el balón y los jugadores son administrados por el servidor, en particular estos juegos tienen un nivel de sincronización muy complejo para que ambos clientes se sientan comodos
 
Si tu juego va a ser de máximo dos jugadores entonces tenes 2 capas Servidor y Cliente, en el servidor se aloja toda la lógica del juego y los atributos, por ejemplo para patear la pelota -
 

Network.sendCommand("shot_ball");

 
Cuando el servidor recibe este comando hace que X jugador patee el balón tienen el el control absoluto del juego.
 
 
 
Por eso este script está mal, en principio se ejecuta de manera normal, tendría que ver como esta configurado el NetworkIdentity, pero de ninguna manera funcionaria .
 
 
 
UNET no es un sistema para armar juegos multijugador como si fuera mágico, simplemente nos facilita el intercambio de paquetes y nos brinda servicios como Relay, Server,  migration... etc, pero lógicamente todo esto es un mundo muy avanzado, tu limite no tendría que ser el lenguaje de programación.
 
 
 
Haz los tutoriales de UNET y aprende C# con mas calma y pronto podras hacer lo que te propongas. 

entonces como lo hago para que funcione, en principio sin online funciona

una cosilla porfavor respondanmela:
 
es que tendo 2 spawns el el juego y uno mira al lado opuesto que el otro (tipo rocket leage) pero el coche siempre va a moverse hacia delante y yo quiero que se mueva con respecto a donde mira.
 
no se si me entienden pero si no es asi ayudarme porfavor

Etiquetas: