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ú

Temas - francoe1

#1
Recursos / SpriteAnimator 2D Tookit
Septiembre 13, 2019, 08:29:00 AM
#2
 
 
CGLocalization es un sistema de localización simple y robusto para localizar su proyecto de una manera fácil. Se envía con una ventana de edición intuitiva para ayudarlo a crear los idiomas que su proyecto va a admitir.
 
 
 


   
      
eature=oembed" width="480">
   


 
 
 
Características:

- interfaz pro, disponible en 4 idiomas (inglés, español, francés y portugués. ¡Puedes traducirlo en su idioma!)

- Ejemplos de escenas incluidas.

- Localizar cadenas y objetos de la unidad

- Utilice componentes localizados para localizar texto, menú desplegable, imagen, audio, Sprites, prefabricados, TextMesh, TextMesh Pro y más. Puede localizar otros componentes con unas pocas líneas de código.

- Añadir tipos de clave de uso común

- Editar todos los valores de una clave en una ventana separada.

- Ordenar las teclas alfabéticamente o arrastrando

- Exportar/Importar claves de cadena a TXT y XML

- Genera un script de constantes de las llaves para usar en tiempo de compilación

- Traducción automática con Google Translate

- Buscar claves por nombre o tipo.
 
Disponible en Assets Store https://assetstore.unity.com/packages/tools/localization/cglocalization-130251
 
Capturas
 

 
 
#3
Comparto con ustedes una simple manera de crear un Framework para trabajar con UGUI de manera organizada -
 
Si les gusta el contenido y les interesa el desarrollo de un Framework mas completo comentar el video -
 
cver=1" width="640">
 
 
 
¡Saludos a la Comunidad!
#4
General (Antiguo) / La pagina caida con error 504
Enero 31, 2018, 11:01:29 PM
Esto me paso a mi o a varios, hace mas de 8 dias que no puedo entrar
#5
General (Antiguo) / Modelos 3D Gratis [Google POLY]
Enero 11, 2018, 03:33:30 PM
https://poly.google.com
 
Una web de google donde descargar/aportar modelos.
 
 
 
 
#6
General (Antiguo) / ¡Modelo Triple A Gratis!
Marzo 18, 2016, 07:34:29 PM
 Los interesados en el Modelo, pasen por el blog para poder descargar.Si dejas un comentario con tu Email en el blog, participas del Sorteo de otros modelos triple A, tambien estará en juego un Curso de Blender modelacion y texturización. http://unitydoc.blogspot.com.ar/2016/03/modelo-gratis-para-nuestro-juego.html">IR AL BLOG
#7
General (Antiguo) / VOTACION para el futuro del Foro
Marzo 10, 2016, 07:40:05 PM
Reportó 2 bug,1 - El sistema de votación debería estar filtrado por Usuario y no por IP.2 - Una vez realizado el voto, directamente desaparezca el tan molesto panel.Gracias. Saludos! 
#8
General (Antiguo) / Timer para C# - Aporte
Marzo 04, 2016, 11:38:06 AM
Buenas a todos, espero que anden bien.Como dice el titulo voy a aportar un pequeño componente que he creado hace un tiempo ya, se trata de un Timer, este nos permite gestionar el tiempo en segundo para efectuar acciones, consta de una muy simple implementacion, solo importamos una DLL a nuestro proyecto, luego agregamos en nuestra escena el Controlador del Timer.Con esto ya estaría configurado para utilizar, ahora vamos al script donde queramos agregar un Timer y agregamos la librería CustomTool.¡Script de Ejemplo!
using UnityEngine;
using System.Collections;
using CustomTool;

public class Weapon : MonoBehaviour
{
private TimerItem                _timerReload;

private int                   _cadence = 1;
private float                   _tmpCadence = 0;

private void Start()
{
   _timerReload = Timer.Singletone.QuickTimer (1, false, true);
   ReloadEventSetup ();
}

private void Update()
{
   if(Input.GetKeyDown(KeyCode.R))
   {
      _timerReload.Start ();
   }

   if (Input.GetMouseButton (0) && !_timerReload.IsRuning)
   {
      if (_checkCadence)
      {
         Shot ();
      }
   }
}


private bool _checkCadence{get{ if(_tmpCadence < Time.time){ _tmpCadence = _cadence + Time.time; return true; } else return false; }}

public virtual void Shot()
{
   print ("shoting");
}

public virtual void Reload()
{      
   print ("Finish Reload");
}

private void ReloadEventSetup()
{
   _timerReload.EventStart += () =>
   {
      print ("start reloading");
   };

   _timerReload.EventFinish += () =>
   {
      Reload();
   };

   _timerReload.EventStop += () =>
   {
      
   };
}
}
Como veras se maneja por Eventos, estos son muy descriptivos con sus propios nombre.1- Para crear el Timer utilizamos la siguiente función Timer.Singletone.QuickTimer(TiempoDeEspera,AutoRepeticion,GestionManual);2- Utilizamos la Funcion Start para dar inicio al Contador.3- Si deseamos terminar con el contador antes de que este finalice utilizamos Stop.4- Para limpiar todos los contadores utilizar Timer.Singletone.ClearAll().5- Para detener todos los contadores utilizar Timer.Singletone.StopAll(). Existen algunas cositas mas, esta completamente en Español podes guiarte muy fácilmente. ¡Saludos!
http://unityspain.com/applications/core/interface/file/attachment.php?id=9273">Timer.rar
Link en MEGA por si falla el del Forohttps://mega.nz/#!cslnkShQ!jnJnbSSBtYg7gxeAHvQ00IUxyR0_tbrChxJ-pXZGvz8 
#9
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:
private void Shot()
{
    Ray = Camera.Look;
    RaycastHit Hit;
    if(Raycast out Hit)
    {
        if(Hit == "Enemy")
        {
            Ejecuta Accion
        }
    }
}
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.
public void Shot()
{
    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;
    }
}
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
#10
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.
public const int MaxHealt = 100;
[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);
}
bien con esto ya tendríamos nuestro Sistema de salud casi terminado, pero debemos tener algunas cosas en cuenta.
  1. 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();
     
  2. 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()
    {
        if(Healt <= 0)
        {
            IsDeath = true;
        }
    }
    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: 
    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.
  3. 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. 
¿Cómo lo solucionamos?La solución en cierta parte, sería utilizar Eventos, va a seguir existiendo un tiempo de retardo, es normal, pero la información de las instancias de cada cliente va a ser más clara.
 
[SyncVar]
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();
}
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. 
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 
#11
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!  
#12
¡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! 
#13

Si necesitas una herramienta de joystick virtual para tu proyecto de plataforma móvil, seguro esta es la opción más rápida y sencilla que podrás encontrar.

Características:
                * Simple Implementación.
                * Optimización para correcto funcionamiento en cualquier móvil.
                * Posibilidad de cambiar de Joystick Físico a Virtual con un Click.
                * Scripting Sencillo.
                * Totalmente Configurable.
                * Múltiples Joystick, Sin Límites.

 

Implementación:
                1- Abrir el UnityPackage descomprimirlo en nuestro Proyecto de Unity3D.
                2- Crear Canvas en nuestra Escena.
                3- Veremos que en el Menú superior aparecerá una nueva solapa llamada 'Control', accediendo a esta tenemos una única opción Joystick, la seleccionamos.
                4- Aparece una ventana con las Opciones para la Configuración Grafica el Fondo y la Palanca (Pad and Handle).
                5- Presionar Guardar, y ya tienes tu Joystick Virtual listo para utilizar.Hay un Script de Prueba para que vean cómo Funciona. Es muy simple. 
http://unityspain.com/applications/core/interface/file/attachment.php?id=8991">Joystick Franco.unitypackage

#14
General (Antiguo) / Lighting Ball [ANDROID] + [PC]
Diciembre 02, 2015, 05:12:55 PM
#15
General (Antiguo) / Mi Humilde opinión sobre EUROPA
Noviembre 18, 2015, 11:51:59 PM
Buena a todos los Usuario del Foro.Hoy escribo porque realmente la situación de Francia con ISIS es alarmante, se que este foro está conformado por varias personas residentes en Europa, me gustaria saber como están viviendo estos momentos de plena incertidumbre, y si lo pasado en París se refleja en el resto de Europa.A esto quiero añadir mi humilde opinión y análisis sobre la problemática.
    ¿A Donde vamos a llegar?, muchos títulos de Diarios, y eminencias como Papa Francisco, han pronunciado un temido resultado a todos esto 'La Tercera Guerra Mundial', me dedique a buscar y leer muchísima información sobre esta organización, sus Jefes y sus objetivos. Esto decantó en algo que de verdad me aterra, el objetivo de tal es dominar el mundo, matar a todos los que difieran con su religión o raza, esto lo practican desde hace años, donde en islamia la guerra es entre el gobierno y los civiles.    ¿Que postura tomar en esta situación?, Es muy dificil saber decidir qué País hizo bien las cosas, todos sabemos que para que una guerra comience se necesitan dos, por esto existen varios motivos de los cuales te hacen pensar que apoyar el uno o el otro está mal. La mejor postura en esta situación es apoyar a la gente indiscriminadamente de su origen.    ¿Estamos en Guerra?, Una pregunta aterradora, la gente dejó de percibir el gran daño que esto puede ocasionar, por tal, no percibe ni siente el peligro que los rodea, París está en Guerra, esto quiere decir, un gran problema comenzó, segun mi investigacion Rusia da el apoyo material a ISIS, dando acceso a armas, vehículos y cosas aún más peligrosas. Esto lleva a que EEUU no meta la pata por grandes amenazas rusas y de la propia ISIS, estas se deben a que EEUU tiene armas de gran alcance, Bombas de destrucción masiva o químicas, que para la ISIS serán de total utilidad, que nada nos haga pensar que teniendo comentado arma no la utilizarían. Esto engloba grandes problemas mundiales, esto se denomina un estado de guerra. Deberíamos estar alertados, prevenidos y atentos a todos los eventos, no esperemos a ver con nuestros ojos lo que hoy viven en París.Me gustaría apoyar a todas las personas inocentes, que en estos y pasados eventos violentos han perdido parte de su vida, tengo muchos seres queridos y familiares en Europa, y también les e preguntado sus opiniones y el ambiente, pero me gustaría aun recopilar más información, para poder percibir y en lo posible brindar la ayuda que esté a mi alcance.No quiero que este tema se vuelva una discusión de ideologías, política, o creencias, todos podemos aportar con respeto y solidaridad. Un Saludo para todos los Usuario, y fuerzas para aquellos que están hoy viviendo un mal dia.
#16
General (Antiguo) / SQLite + Unity3D
Octubre 24, 2015, 02:42:07 PM
Buenas a todos.
Estoy con un problema, no soy de preguntar mucho pero me he encontrado con un problema o "BUG" dentro de Unity3D. Lo que quiero lograr es compilar un APK para android y empaquetar un Base de Datos SQLite, hace un tiempo lo implemente y todo funciono de maravillas, pero ahora no funciona, quizás me estoy olvidando de algo.Intento 1: Agregar la extencion ".db" para que sea Compilada como un recurso. <- No funciona Intento 2: Mover la base de datos a la carpeta "Resources", Tampoco funciona.Bien, lógicamente estas dos primeras no tendrían por que funcionar, ya que la base de datos si se crea dentro del APK, pero luego al ser instalada en el dispositivo la misma no se copia, es decir solo queda empaquetada en el APK.Intento 3: Cada vez que el juego inicia pasa por la siguiente comprobación ¿Existe la base de datos en /Ruta/Datos.db?, de no ser, utilizamos la carpeta "StreamingAssets" para poder cargar en RunTime la base de datos y copiarla a la ruta que deseamos. !ANDROID no deja que copiemos o movamos estos archivos a ninguna parte del telefono¡, algo bastante raro ya que programando nativamente jamas tuve esta clase de problemas. Esto es todo, pero tengo unas preguntas...
¿Alguien sabe como hacerlo de una mejor manera?¿Existe una alternativa SQL para utilizar con Unity?¿Cual de los 3 intentos parece mas factible? PD: El  "bug" es que en versiones anteriores los archivos puesto dentro dela carpeta Resources se copiaban a la ruta de instalación de la aplicación.  Verificando con Root Explorer en android, pude ver que esto no se estaba haciendo si bien el APK tenia el archivo, en la instalación este pasaba por alto.Un Abrazo a todos.
#17
General (Antiguo) / ¡Sistema de Armas! Tutorial [APORTE]
Septiembre 09, 2015, 09:58:36 PM
Pido Disculpas al foro por crear este TEMA, ya que el tema original se encuentra en otra sección, pero veo que la mitad de los usuarios activos que entran al foro no se percatan del material nuevo. Eso creo.

Igual Suerte, espero que les sirva y puedan aprender.http://unityspain.com/topic/22238-crear-sistemática-de-un-arma-básico-vídeo-tutorial/ ¡Un Abrazo para Todos!PD: Si se puede mover el tema original, borrar este y dejar el original dentro de esta sección :).. Gracias
#18
eature=oembed" frameborder="0" allowfullscreen="true"> Pasar por mi Canal y Subscribirse
#19
General (Antiguo) / Interpolacion Lineal
Junio 10, 2015, 02:21:21 PM
Buenos días gente, estos días ando medio complicado con las matemáticas y no puedo resolver algo que ya lo eh resulto miles de veces. Mi problema es hallar una Distancia X entre dos puntos, A y B, supongamos que A = (2,2) y B = (20,20), el Punto medio D = A y B = (Ax+Bx)/2 (Ax+By)/2 Esto es fácil, pero no puedo interpolar un punto que se encuentre a X distancia tanto en X como Y para generar un limite Circular. Imagen de ayuda
 

 
Despejando M con X distancia en X e Y podría solucionarlo, pero no se me ocurre como plantearlo.
 
Desde ya muchas Gracias!