Menú

Mostrar Mensajes

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.

Mostrar Mensajes Menú

Mensajes - francoe1

#496
General (Antiguo) / Jam'RoadRunnersRacing
Febrero 17, 2017, 04:49:10 PM
¡Muy bueno! ¡Gran trabajo!
#497
General (Antiguo) / Problema delay en spawn
Febrero 17, 2017, 04:43:23 PM
Toma muy en cuenta lo que dice stick.
 
La programacion en red no es algo simple, y el sistema UNET hace las cosas aún más difíciles de lo que parecen, cuando se requiere un juego en red se hablan de muchas cosas el uso de múltiples Socket TCP y UDP la abstracción de eventos a sincronizar y otro tanto más. Te recomiendo lo siguiente.
 
¿Que debo sincronizar? ¿Es aceptable la pérdida de datos? ¿Cómo sincronizar un evento?
 
Se entiende que en un juego de red los clientes no están perfectamente sincronizados, y este es el error de los que recién comienzan, juegos como Battlefield utilizan metodos de interpolacion muy transparentes para hacernos creer que estamos sincronizados, pero en realidad las instancias de los clientes se encuentran en muchas ocasiones muy disparejas. La interpolación tiene pro y contras por ejemplo la tan odiada "Compensación de Lag" que experimentan los jugadores.
 
Si tu idea es armar un juego con UNET te recomiendo que leas acerca de QoS, que entiendas los canales de UNET y como trabaja Network Transport.
 
Ahora, vamos con las preguntas - ¿Que debo sincronizar?
 
Bien, para la sincronización de la posicion, rotación y la cámara del jugador se pueden utilizar 5 valores decimales. posX, posY, posZ, rotY, rotCamX. Con un paquete que envíe estos datos ya puedes simular un interpolacion en el cliente. 
 
¿Es aceptable la pérdida de datos?
 
Cuando se trata de la sincronización de la posicion estamos enviando 30 Paquetes x segundo, basándonos en VALVE los llamados Network Tick, si 1, 2 o 3 paquetes se pierden no es de mucha importancia debido a que se estará recibiendo constantemente nuevos datos, en caso de la posicion se utiliza un TimeSpan para saber cuando se envió el paquete, debido a que una conexión UDP no nos garantiza la posicion correcta de los paquetes.
 
¿Cómo sincronizar un evento?
 
Existen 2 tipos de eventos, los "Requeridos" y "No requeridos", muy similar a la respuesta anterior, los requeridos son aquellos eventos de los cuales nos tenemos que asegurar que lleguen, por ejemplo el daño recibido o producido, el score, drop o drag de un arma, un disparo, los no requeridos pueden ser eventos de la escena, que pueden fallar por que no afectarían directamente al cliente.
 
 
 
Tu caso en particular. Instanciar un objeto en la posicion correcta.
 
Bien, partimos de que estas enviando desde un cliente la posicion de Instancia, esto es un error grave debido a "La interpolación", ¿Como solucionarlo?, creamos un paquete, que indique qué objeto va a spawnear y desde donde, en este caso, se spawnea una "bala" desde X cliente.
 
Cliente -> Enviar evento de instanciar bala al servidor -> Servidor -> Envía a todos los clientes el evento de instanciar bala -> lo clientes instancian la bala en el lugar donde actualmente tienen sincronizado dicho jugador. 
 
¿Se entiende?
 
Veamos un Código de Ejemplo.
 
El cliente que efectúa el disparo.
 

private void Shot()
{
  //Ejecutar instancia local..
 
  //Enviar evento al Servidor...
  var pkg = new NetworkSyncEvent{EventID = 1, Data="ID_OBJETO_BALA"};
  NetworkServer.Send(pkg);
}
public class NetworkSyncEvent
{
  public int EventID;
  public string Data; // De ser necesario para enviar alguna informacion, en este caso el id del objeto a instanciar.
}

 
El cliente que recibe el evento.
 

private void NetworkEjecuteSyncEvent(NetworkClient sender, int eventID, string data)
{
switch(eventID)
{
   case 1:
   {
      int id_object = int.Parse(data);
      Instantiate(Network.SyncObject[id_object], sender.position, sender.camera.rotation);
   }
   break;
}
}

 
Los clientes locales no son iguales a un cliente remoto, es decir, UNET es simple, pero a la misma vez poco escalable.
 
 
 
Recomendación:
 
Intenta programar tu propio servidor UDP/TCP, experimenta con Sockets, a la larga te vas a dar cuenta de que UNET te limita a muchas cosas, hablo de "HLAPI".
 
LLAPI es otro mundo, un gran trabajo de Unity Technology el problema es que no liberan Network Transport y los desarrolladores no están muy dispuestos a distribuir el código del servidor junto con el del cliente. 
 
 
 
Espero te haya servido! 
#498
General (Antiguo) / Paradox/Xenko Game Engine
Febrero 17, 2017, 03:30:31 PM
En pequeños detalles lógicamente se pueden sacar pros y contras, el problema es cuando queres realmente producir, la manera de trabajar no es óptima, tiene algunas cosas que no me convencieron a primera vista , mi crítica fue muy por arriba,  la base del motor el "Game Loop" no está armado de la mejor manera, obvio que Unity tiene muchísimo ingenieros detrás solucionando todos los bug.
 
En cuanto mi opinión voy a darle otra oportunidad, ya que ustedes me están dando buenos puntos de vista. ¿Se puede programar en C++?¿probaron Shiva3D?
 
 
 
¿Están utilizando la version 1.9.3 BETA? ¿vieron algun error en chino?
 
En cuanto termine de probar otras cositas pendientes vuelvo a comentar.. 
 
 
 
Retiro lo dicho anteriormente, que idiota soy, aca esta toda la DOC, por alguna razon el dia de ayer entre a una web desactualizada de XENKO... Se ve fantástico... 
 
http://xenko.com/features/#ui_editor_popup
#499
General (Antiguo) / Paradox/Xenko Game Engine
Febrero 16, 2017, 05:27:44 PM
Es muy malo, el parecido a Shiva, son motores que en realidad dan mucha pena, la interface te perdes, no sabes si esta bien o mal, apretadas algo y se cierra todo, errores en chino.. 
 
Cada vez que queres probar tenes que compilar, osea una mierda, shiva tiene un test en el editor, y es multiplataforma, ahora voy a estar viéndolo, de todos modos Unity es muy superior..
 
Torque3D - Malisimo, encima de pago.

CryEngine - Prefiero Unity si tenemos que pagar.
 
 
 
sigo con los test.. 
#500
General (Antiguo) / Paradox/Xenko Game Engine
Febrero 16, 2017, 03:56:59 PM
Cita de: lightbug date=1487233863Con esto de la noticia de Untiy 2017 ($$) se me dio por hacer una busqueda, mas que busqueda una ojeada a los motores modernos y gratuitos de hoy en dia y me crucé a Xenko Game Engine (mediante el canal de YouTube "Gamefromscratch") .
   
   
      Un motor que hace un tiempo venia ojeando y que pintaba lindo, es de Silicon Studios (japoneses) , open source, basado en C#, con muchas caracteristicas. (Seguro lo recordaran si han visto el video del robot naranja en el museo).
   
   

      
         
eature=oembed" width="480">
      
   
   
      Aca el link con las especificaciones:
   
   
      http://xenko.com/features/
   
   
       
   
   
      Es solo para mostrarlo por si no lo conocian, probablemente hoy lo descargue y lo pruebe, luego comento a ver que tal.
   
   
       
   


Lo acabo de probar, es una mierda, literalmente.
#501
General (Antiguo) / Paradox/Xenko Game Engine
Febrero 16, 2017, 01:20:10 PM
Llege a la misma conclusión, buscar alternativas, de todos modos para un proyecto Serio/Normal para alguien no residente de argentina es algo rentable, pero para los argentinos es mucha plata para el desarrollo persona.
#502
General (Antiguo) / Trigonometría con Mathf en Unity
Febrero 13, 2017, 06:24:49 PM
Excelente :) Muchas gracias!
#503
El problema es que tenes seleccionado en modo automático el Backeo.
 
Fijate en la Pestaña Lighting abajo del todo tenes tildada lo opción automático, destilada, luego cuando cambies algo en tu escenario deberias backear, siempre y cuando efectues los pasos previos, como static para las sombras y otras cosas necesarios para las luces, no obstante no es tan complicado, es solo la opcion de automatico.
#504
La detección del Raycast puede estar fallando, no recomiendo utilizar un "RayCast", deberias utilizar un Circle o Box, aunque es algo personal..
 
Para la detección del suelo podrias utilizar esto.
 

void OnTriggerEnter()
{
  IsGround=true;
}
void OnTriggerStay()
{
  IsGround=true;
}
void OnTriggerExit()
{
  IsGround=false;
}

 
Y podrias comprobar el Punto de colisión, para saber si se está produciendo en los lados, arriba o abajo del jugador.
#505
Buenas, por que no intentas con esto.
 
 
 

var stage = score / 1000; // Cada mil puntos stage incrementa.
switch(stage)
{
    case 0: break;
case 1: break;
case 2: break;
default: break;
}

 
de esta manera seguro no fallará.
#506
pero el raycast depende de otros factores que tambien afectan el rendimiento del juego, es decir el ítem tiene que cumplir parte de la física para que RayCast funcione, deberias hacer tus propias pruebas, tomar la distancia de objetos no es algo costoso para el procesador, no es algo que tengas que hacerlo constantemente podrias realizarlo cada .5s. Deberías probarlo verás que es más óptimo.
 
1º Tomar todos los objetos Interactivos.
 
2º Medir su distancia.
 
3º Si la distancia es menor que X, verificar si está a la vista con el producto.
#507
General (Antiguo) / Null Reference Exception
Diciembre 22, 2016, 06:23:48 PM
Si la Variable "inv" está sien
 


void OnCollisionEnter2D(Collision2D collision)
{
   if (collision.gameObject.tag == "Item")
   {
      Collectable cole = collision.gameObject.GetComponent<Collectable> ();
              if(cole != null)
              {
            inv.AddItems (cole.nameItem, -1);
            Destroy (collision.gameObject);
              }
              else
              {
                    Debug.Log("erro el item no contiene el componente Collectable");
              }
   }
}

 
do correctamente asignada el problema se debe a que no esta tomando el componente la función GetComponent.
#508
General (Antiguo) / Problema Básico
Diciembre 17, 2016, 08:16:21 AM
El problema es que no estas entendiendo la lógica de la programacion. 

Te recomiendo empezar por aprender a programar.
#509
Abre pasado muchos malos momentos intentando armar un sistema interactivo genérico cuando logre algo pasable lo intente meter en un proyecto multijugador LAN/Online y me di cuenta que era una mierda tuve que empezar todo de nuevo, estaba armado con interface pero no me sirvio, por esa experiencia digo que armar algo interactivo bueno es un problema gigante, a eso sumale el sistema de selección de armas que si bien al final meti mano y lo arme de 0 en el mismo proyecto me di cuenta que tener algo óptimo y funcional lleva muchísimo tiempo,planeamiento y conocimiento.
 
Una de las cosas que me sirvió mucho es una función de tipo genérica con un Call Back Genérico dentro del componente PlayerCamera, la idea de esto era a través de un método, el objetivo tomar cualquier objeto que el jugador estuviera viendo. La función cuenta de 3 parámetros más el tipo genérico. 
 

public GetObjectLook<T> (Action<T> CallBackLookObject, Action CallBackExit, int Distance);

 
 El resultado fue bastante bueno, me olvide de RayCast por un largo tiempo al trabajar con CallBack las cosas se hicieron muchisimo mas simples, de momento este método lo utilizo para muchas partes del proyecto, la utilización de CallBack y Eventos es algo muy potente.
 
Por el momento C# .NET lo manejo muy bien tengo varios cursos en cuanto a esto y muchísimo de C++ , UML y otros extras favorables al desarrollo, pero me gusta tomar ideas como esta, siempre voy viendo en internet a ver si alguien encuentra la solución a X problemas de manera más eficiente.
#510
Una forma de optimizar sería sin utilizar raycast, podrias simplemente verificar la distancia entre el Objeto Interactivo y el Jugador si esta es menor a 2 (Esto varía a gusto y requerimientos del juego), luego tomamos el producto de las 2 posiciones.
 

foreach(var item in FindGameObjects<IInteractive>())
{
    Vector3 forward = transform.TransformDirection(Vector3.forward);
    Vector3 toItem = item.position - transform.position;
    if (Vector3.Dot(forward, toItem) > 0.6f) print("Look Object");    
}

 
Y si el resultado no te convence, es decir, existe un objeto entre el jugador y el objeto interactivo de esta manera no estaríamos comprobando, pero en este caso, si pasa las primeras 2 comprobaciones entonces podrias largar un rayo para comprobar que el jugador puede visualizarlo.
 
De esta manera lo hace BF3 y 4, muchas veces las soluciones son más simples de lo que pensamos.
 
Es cierto que el uso de interface se hace un poco más cómodo, práctico y organizado, el problema es cómo se implementa la interface.