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

#616
podrías utilizar Vector3.Lerp y molerla en relación al target con el Offset deseado.
#617
General (Antiguo) / Un objeto en varias posiciones.
Febrero 02, 2016, 03:55:46 PM
@Arhure Te cite por el siguiente comentario, que fue directamente dirigido a mi persona!
Como la velocidad con el tocino xD[/quote]Lo afirma tu respuesta en concreto.
Mi intención no es molestar, pero me molesta que comente innecesariamente tratando de dar como errada mi respuesta, quizás no es la mas acertada, pero podrías dar tu una respuesta mas relacionada a la intención del usuario sin necesidad de citar mis Respuesta o Sugerencia.Te pido disculpas, pero de verdad no creo saber mas que nadie, todos los días se aprende algo nuevo.
#618
Si el personaje se mueve a través de Físicas, deberías primero crear un vector de dirección, luego a tal dirección multiplicarla por la velocidad.Si es así como lo estas haciendo entonces, solo quedaría cambiar el valor del multiplicador que utilizas para la dirección de la velocidad cuando esté en el aire. CODIGO
public int Speed;
private int currentSpeed;

void Update()
{
    Vector3 Direccion = new Vector3(Axis.h,0,Axis.v);
    Direccion = transform.TrasnformDirection(Direccion);
    if(isGround)
        currentSpeed = Mathf.Lerp(currentSpeed,Speed,Time.deltaTime * 2);
    else
        currentSpeed = Mathf.Lerp(currentSpeed,Speed/2,Time.deltaTime * 2);
       
    Vector3 Vel = Direccion * currentSpeed;
    Vel.y = rigidBody.velocity.y;
   
    rigidBody.velocity = Vel;
}
 
#619
General (Antiguo) / Un objeto en varias posiciones.
Febrero 02, 2016, 03:21:16 PM
@Arthure estas un poco errado en el concepto de PoolObject.
Te explico:
1 - PoolObject no solo sirve para X numero de objetos, si no que puedes tener un Buffer Dinámico para que este se ajuste a la tarea.
2 - La Principal ventaja de utilizar PoolObject es evitar que el recolector de basura se ejecute mientras jugamos, ocasionando Bajas de FPS u ocasionando el cierre de la aplicación.
3 - PoolObject puede ser utilizado en muchas situaciones, no solo donde se disparen 20 Objetos por segundo, Ejemplos: UI, Personajes .. Etc. Saludos -.
 [quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35050" data-ipsquote-contentcommentid="126714">Sin meterme en piscina/no piscina, http://unityspain.com/profile/26011-juanma_teso/?do=hovercard" data-mentionid="26011" href="<___base_url___>/profile/26011-juanma_teso/">@juanma_teso para saber cual va a explotar primero, deberías tener un "manager" de todas las minas que es el que las instancia (del modo que sea) y recoge todos las GameObject o su InstaceID para identificar que objeto es el afectado.Contesto, por que justo estaba escribiendo esto, mientras me llego gente al Trabajo y no puede enviar la respuesta!
#620
General (Antiguo) / Un objeto en varias posiciones.
Febrero 02, 2016, 01:02:59 PM
@Arthure, Fíjate que con mas cuidado en lo que dice el usuario
se me ocurrió que una vez se usaba una mina podría "reutilizarla", pero resulta que no sabría que mina va a explotar primero[/quote]Claramente, esta situación necesita PoolObject. 
#621
General (Antiguo) / Un objeto en varias posiciones.
Febrero 02, 2016, 07:52:12 AM
Estas hablando de PoolObject, obvio que se puede. Busca en el foro existe un usuario llamado llie que estubo armando un sistema de PoolObject que funciona bastante bien! Aun que si te pones a pensar es super simple! Suerte!  
#622
General (Antiguo) / 2 Personajes Cambio
Enero 31, 2016, 08:36:14 PM
No entiendo el DesLike a mi comentario, no quiero reclamar nada, pero este usuario está haciendo una pregunta muy ridícula, es lo mismo que diga, como puedo hacer para cambiar un de equipo en un juego de fútbol y que siga la IA, es un simple cambio, es decir, lo controlas o dejas que controle la IA, eso es super simple, lo harías con un booleano un switch, un entero que diga que entidad lo controla a dicho agente. No quiero armar bardo, pero me parece ridiculo que IRobb y Yo nos llevemos DesLike por responder correctamente la pregunta!
#623
[quote author=juanma_teso" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35053" data-ipsquote-contentcommentid="126673">Muy bueno http://unityspain.com/profile/18127-francoe1/?do=hovercard" data-mentionid="18127" href="<___base_url___>/profile/18127-francoe1/">@francoe1!! Sería buena idea que el Networking tenga foro propio... http://unityspain.com/profile/18485-pioj/?do=hovercard" data-mentionid="18485" id="ips_uid_3" href="<___base_url___>/profile/18485-pioj/">@pioj :)
#624
General (Antiguo) / 2 Personajes Cambio
Enero 31, 2016, 05:44:25 AM
Es algo muy simple, solo necesitas saber programar y depurar tu problema.Herramientas: switch, IAControl, PlayerControl y ya está..
#625
Bienvenidos a la segunda parte del "Tutorial de UNET en español"Hoy vamos a tratar de entender cómo funcionan los comandos y sync var de una manera más detallada y luego vamos a programar un sistema de puntuación que nos permita gestionar  KILLS - DEATHS - SCORE - NAME¿Cómo funcionan los Command?
Los comandos son funciones que se encuentran del lado cliente pero se ejecutan del lado servidor, es decir, cuando nosotros llamamos un comando desde cualquier cliente no se ejecuta en dicho cliente, si no en el Servidor. ¿Y esto para que sirve?, Bien, esto nos sirve para dejar que el servidor se encargue de todos los datos del juego aplique las reglas y sincronice estos datos con los demás Jugadores, Ver el Ejemplo de Sincronización de Movimiento.¿Qué son las SyncVar?
Con las SyncVar podemos sincronizar variables de datos Simples, Como INT - STRING - FLOAT y otros característicos de unity como VECTOR3, aunque estas siempre deben ser actualizadas por el servidor, ya que el cliente no tiene el privilegio de hacerlo.Entonces ¿Cómo se fusionan las dos?
Primero, deberíamos pensar la lógica de forma local, es decir, sin ponernos a pensar en Sincronización u otros aspectos Multijugador, supongamos que estamos pensando hacer un FPS SIMPLE, entonces empezamos creando el Movimiento del Jugador, Move, Jump, Rotate, RotateCamera estas serían nuestras funciones para controlar todo el movimiento del personaje. 
Una vez ya programado esta parte, debemos Sincronizar la Posicion y Rotacion del Jugador, más la Cámara (VER PARTE 1).Esto fue una breve y simple explicacion de como funciona, pero voy a resumirlo en simples pasos explicativos para que sea más fácil entender.
1- Realizamos la Acción Localmente
2- Enviamos los Resultados por Cmd al Servidor
3- El Servidor asigna los datos recibidos en su correspondiente variable.
4- Los Cliente no locales sincroniza cada instancia con los valores sincronizados.Bueno, ya teniendo en cuenta todo lo anterior pasemos a construir nuestro sistema de Puntuación.
1- Vamos a necesitar 4 Variables 4 Funciones y 4 Comandos.
 
[SyncVar]
public string Name;
[SyncVar]
public int Kills;
[SyncVar]
public int Deaths;
[SyncVar]
public int Score;

public void SetName(string value)
{
    Name = value;
    Cmd_SetName(value);
}

public void AddKill()
{
    Kills++;
    Cmd_AddKill(Kills);
}

public void AddDeath()
{
    Deaths++;
    Cmd_AddDeath(Deaths);
}

public void AddScore(int value)
{
    Score += value;
    Cmd_AddKill(Score);
}

[Command]
private void Cmd_SetName(string value)
{
    if(!isServer)return;
    Name = value;
}

[Command]
private void Cmd_AddKill(int value)
{
    if(!isServer)return;
    Kills = value;
}

[Command]
private void Cmd_AddDeath(int value)
{
    if(!isServer)return;
    Deaths = value;
}

[Command]
private void Cmd_AddScore(int value)
{
    if(!isServer)return;
    Score = value;
}
Con esto ya tenemos nuestro sistema de puntuación funcionando, ahora debemos gestionarlo, vamos a crear una función OnGUI para visualizar los datos de todos lo Clientes conectados.
void OnGUI()
{
    foreach(PlayerInfo current in GameObject.FindObjectsOfType<PlayerInfo>())
    {
        if(current == this)GUI.color = Color.red;
        GUILayout.Box(current.Name + " D [" + current.Deaths + "] K [" + current.Kills + "] S [ " + current.Score + "]" );
    }
}
Bien, ahora podemos hacer nuestro test utilizando Inputs y la función Update
void Update()
{
    if(!isLocalPlayer)return; // Si no es el jugador Local Sale de la funcion UPDATE

    if(Input.GetMouseButtonDown(0))AddScore(100);
    if(Input.GetMouseButtonDown(1))AddKill();
    if(Input.GetMouseButtonDown(2))AddDeath();
}
FIN DE LA SEGUNDA PARTE Siguientes
Sistema de Puntuaje + UNET + Simple UI
Sistema de Salud + UNET + Simple UI
Explicación más detalladas de Command
Sistema de Disparos + UNET + Simple UI

VIDEO TUTORIAL de todo lo explicado
Como dije al comienzo, espero que esto no sea solo un aporte de mi parte, si no que todos los que sepan y quieran aportar vayan anexando sus conocimiento, prácticas y ejemplos para poder entender mejor cómo armar nuestro propio juego en red..

PD: El post lo escribí todo desde la WEB pueden existir errores en la Sintaxis de la programacion. NO SE OLVIDEN DE PASAR POR MI CANAL DE YOUTUBE, DONDE SUBO TUTORIALES SOBRE UNITY
">IR AL CANAL [/quote]¡SALUDOS A TODOS y SUERTE!  
#626
¡Buenas a Todos!
¡Breve reflexión, resumen y crítica!Este topic lo creo con la intención de beneficiarnos todos en la programacion de Networking sobre UNET, si bien la herramienta nos da el título de "Facil implementacion" todos los que hayan experimentado se habrán dado cuenta, que a pesar de las fallas que aun tiene, su implementacion no es tan sencilla. Lo que los desarrolladores de UNET quisieron decirnos es que es más sencillo que RakNet o programar sobre Socket. [/quote]Para Empezar necesitamos una version 5 de Unity3D (Mejor si es la Última), conocimiento en programacion C#, breve idea de cómo funcionan Servidores Autoritativos.Primero Pasos1- Empecemos por crear un objeto vacío en la escena y agregamos el componente de NetworkManager y NetworkManagerHud.
2- Crear un Script en C# asignar el nombre de PlayerSetup (Opcional) agregar la librería UnityEngine.Networking y la clase PlayerSetup que herede de NetworkBehaviour.
3- Empezar con la Programacion del Movimiento:
    A- Programar un movimiento, simple sin fisicas.
private void Movement()
{
    Vector3 Direction = new Vector3(Input.GetAxisRaw("Horizontal"),0,Input.GetAxisRaw("Vertical"));
    Direction = transform.TransformDirection(Direction);
    Vector3 NextPosition = transform.position + (Direction * Time.deltaTime * 5);
   
    transform.position = NextPosition;
}
     B- Para llamar a esta función debemos primero comprobar si somos el Jugador Local (http://docs.unity3d.com/ScriptReference/Networking.NetworkBehaviour-isLocalPlayer.html">isLocalPlayer).
     C- Volvemos a la escena donde teníamos nuestro NetworkManager creamos un cubo y le asignamos nuestro componente PlayerSetup, automáticamente se añadirá junto a este otro componente llamada NetworkIdentity, en el debemos seleccionar la opción LocalPlayerAuthority creamos un prefabs del cubo y lo borramos de la escena.
     D- Nos dirigimos al componente NetworkManager, vamos a donde dice SpawnInfo y en el lugar de PlayerPrefab asignamos el que creamos anteriormente.
     E- Volvemos al Script PlayerSetup y desde la función Update ahora podemos llamar a nuestra función Movement, antes comprobando si es el Player Autorizado.
public void Update()
{
    if(!isLocalPlayer)
    {
        //CLIENTE NO LOCAL
        return; //Si no es el jugador termina la ejecución de Update
    }
    else
    {
        //CLIENTE LOCAL
        Movement();
    }
}
4- ¡Excelente!, Ahora si compilamos para Windows podremos ver que el cubo se mueve en ambas ejecuciones, pero nos daremos cuenta de que el Jugador 1 no podrá ver el movimiento del Jugador 2Sincronizando el movimiento1- Para sincronizar el movimiento en red se utiliza una técnica llamada predicción de la posicion, esto quiere decir que mientras nos movemos de manera local el servidor intercepta multiples actualizaciones de nuestra posicion pero como el movimiento no va a ir por un canal seguro, podría perderse un paquete o simplemente el Ping sea muy alto y los clientes no locales experimentarian un movimiento extraño en los demás clientes.¿Cómo creamos una sincronización?    A- Para sincronizar debemos enviar los datos al servidor, gracias a UNET podemos utilizar SyncVar y Command para hacer este trabajo mucho más simple que el conocido "Serialize and Deserialize" de paquetes. Para empezar necesitamos crear una variable privada tipo Vector3 donde almacenamos nuestra posicion, y una función de tipo void con los atributos de Command
      ¿Qué son los Command? Son funciones que se encuentran del lado del Cliente pero siempre se ejecutan en el servidor.
      ¿Que el SyncVar? SyncVar nos sirve para que una variable esté sincronizada para todos los Cliente. 
      ¡A tener en cuenta! Si nosotros cambiamos una variable de forma local, sin avisarle al servidor, los demás clientes no estarán enterados de este cambio, para que un SyncVar funciones esta debe ser modificada por el servidor, y este mismo se encarga de actualizar el valor en todas las instancias de cliente.  Veamos el Código
[SyncVar]
private Vector3 SyncPosition;

[Command]
private void Cmd_SendPosition(Vector3 Pos)
{
    SyncPosition = Pos;
}
2- Ya tenemos nuestro sistema para Sincronizar la posicion de nuestro jugador, ahora vamos a ponerlo en marcha, aun nos faltan 2 pasos muy importantes, al cliente local no le interesa el valor de SyncPosition, ya que este no depende de tal variable para su movimiento, pero no obstante los otros clientes no locales van a tomar ese dato para ubicarte en su espacio local. ¿Cómo hacemos esto?, vimos que nuestra función Update está separada en dos partes, la primera para los clientes NO LOCALES y la segunda es solo para clientes LOCALES, quiere decir que vamos a utilizar la parte no local para sincronizar nuestro movimiento en los demás clientes.

    A-Vamos a enviar la informacion de nuestra posicion al servidor utilizando el comando Cmd_SendPosition(), esto lo realizamos desde nuestra función Movement();
Cmd_SendPosition(NextPosition);  
    B- Seguido a esto, nos dirigimos a nuestra función Update en la parte no local y creamos un movimiento Suave entra la posicion actual del Player no local y la de la variable Sincronizada
transform.position = Vector3.MoveTowars(transform.position,SyncPosition, Time.deltaTime * 15);
    C- Por Último Compilamos nuestro proyecto y veremos como el movimiento se encuentra sincronizado en ambos clientes.
El Código debe quedar de la siguiente manera
public void Update()
{
    if(!isLocalPlayer)
    {
        //CLIENTE NO LOCAL

        transform.position = Vector3.MoveTowars(transform.position,SyncPosition, Time.deltaTime * 15); // Movimiento del Jugador en ambiente no local
        return; //Si no es el jugador termina la ejecución de Update
    }
    else
    {
        //CLIENTE LOCAL
        Movement();
    }
}

[SyncVar]
private Vector3 SyncPosition;

[Command]
private void Cmd_SendPosition(Vector3 Pos)
{
    SyncPosition = Pos;
}

private void Movement()
{
    Vector3 Direction = new Vector3(Input.GetAxisRaw("Horizontal"),0,Input.GetAxisRaw("Vertical"));
    Direction = transform.TransformDirection(Direction);
    Vector3 NextPosition = transform.position + (Direction * Time.deltaTime * 5);
   

    Cmd_SendPosition(NextPosition);//Enviar información al Servidor.
 
    transform.position = NextPosition;
}
Bueno, eso es todo por hoy, el material es escrito para tratar de explicar mejor las cosas.Siguientes
Sistema de Puntuaje + UNET + Simple UI
Sistema de Salud + UNET + Simple UI
Explicación más detalladas de Command
Sistema de Disparos + UNET + Simple UI

VIDEO TUTORIAL de todo lo explicado
Como dije al comienzo, espero que esto no sea solo un aporte de mi parte, si no que todos los que sepan y quieran aportar vayan anexando sus conocimiento, prácticas y ejemplos para poder entender mejor cómo armar nuestro propio juego en red..

PD: El post lo escribí todo desde la WEB pueden existir errores en la Sintaxis de la programacion. NO SE OLVIDEN DE PASAR POR MI CANAL DE YOUTUBE, DONDE SUBO TUTORIALES SOBRE UNITY
">IR AL CANAL [/quote]¡SALUDOS A TODOS y SUERTE! 
#627
Estas instanciando un Objeto CANVAS?
#628
Quizás la función OnClick Tiene un Error en android.Trata de Hacer un Debug y Captarlo por consola conectando tu Android a la PC mediante USB utilizando ADB TOOLYo tengo un Bat hecho de la siguiente manera.
@echo off
color 0A

cd F:\Back\Java\SDK-Android\platform-tools
adb logcat -s Unity DEBUG

pause

adb logcat -d > F:\Back\Java\SDK-Android\log\Unity3d.txt
Suerte!
#629
General (Antiguo) / Velocidad de rebotes 2D
Enero 20, 2016, 08:09:53 PM
Normalizando el vector multiplicando y clampeando los valores.
#630
El problema es que no creas el material para que se asigne una Textura.Intenta agregar esto..
 
 Renderer rend = esfera.GetComponent<Renderer>();
 Material mat = new Material();
 mat.mainTexture = Resources.Load("texturas/"+ p.file_name) as Texture;
 rend.material = mat;