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

#691
General (Antiguo) / Restablezer vida al istante
Noviembre 18, 2015, 04:15:45 PM
Ya te he solucionado tal problema y has modificado el código de una forma brusca, tanto que no te funciona.¿Que controla este componente?
 - Existe un gran problema de diseño, o directamente no existe tal, te invito a que detengas el proyecto, y lo empieces por diseñar a mano en una hoja. No es necesario redactar un GDD, con un simple documento de orientación ya serviria.  ¿A qué se debe la mala implementacion de vidaEnemegoIA?
"NO SE USAN VARIABLES ESTÁTICAS PARA ESTOS CASOS"¿Tenes un gran utilidad llamada Evento, y creaste una variable de tipo BOOL que reemplace tal?
 - La Diferencia es que en esta necesitaras comprobar continuamente en una función de bucle del juego, ej Update, para comprobar su valor
 
if(isDead) Hacer....
 - Cuando trabajas con eventos las cosas funcionan totalmente distintas, vos no implementas esto (SI tal X Evento), se lo hace de la siguiente manera Evento > Función (Se Generó tal evento Hacemos X), Solo se llaman una vez, EJ en la función Start.
Evento += Función;
 * Los Eventos tienen múltiples ventajas y una de ellas es su óptimo rendimiento y flexible implementacion. Entonces ¿Cómo Solucionamos tu problema?1º Analizemos el Proyecto, ¿Que quieres lograr?2º Analizemos cada Actor , ¿Como es el Persona Principal?, ¿Que puede hacer?, ¿Existe IA o solo es Acción<->Evento?3º Analizar en detalle qué componentes deberias utilizar para tal. EJ : Personaje Principal -> InputManager -> Movement -> Animator -> HealtControl4º Normalizar componente, es decir, que no exista redundancia de datos. EJ: Para Todos los Actores, no importa que sea el Jugador o un Actor del Sistema vamos a utilizar los mismos componentes, Movement -> Animator -> HealtControl.5º Diseñar los Componentes, para este paso lo mejor es HOJA Y LÁPIZ, el diseño de tal, tiene que ser comprendido por cualquier persona, esto quiere decir, no pienses como programarlo, Diseña tus Eventos, y Acciones,  EJ ¿Qué pasa si?.
        ****TIPS****   Para esta clase de diseño, es conveniente utilizar evento relacion, esto se veria de la siguiente manera.
       Actor>Action(Lanza Puñetazo)>¿Di con el Objetivo?>GetTarget>ApplyDamage(Target)>InfoToManager.
       Esto es fácil de comprender para cualquier persona, se leería de esta manera, Actor lanza un puñetazo si este colisiona con el objetivo convierte el objetivo como su target y luego le aplica daño.6º Teniendo todos estos pasos totalmente armados, los analizamos, y volvemos a aplicar una ligera normalización.7º ¡Es hora de programar!La satisfacción más grande para un programador es terminar su cometido con buenos resultados,  y lo único que te lleva a esto es, Amar lo que haces, ser ordenado, diseñar y analizar la problemática, estar dispuesto a aprender y leer, aprender matemáticas, ejercitar bastante y por supuesto, las 2 mas importante, ***verancia y Responsabilidad. Espero sea de tu agrado leer y tratar de entender las cosas, entonces no tendrias estos problemas tan simples.
PD: Espero que esto sea leído por otros usuarios que se encuentran en constantes problemas similares, para que entiendan cómo funciona y puedan seguir adelante sin código masticado.[/quote]Saludos.
#692
Te paso algo que te va a funcionar mucho mejor.
using UnityEngine;
using System.Collections;
using System.Linq;
using System;
using System.Collections.Generic;

public class CarGestion : MonoBehaviour
{
    public List<CarInfo> ListCar;


    public void UpdateListCar()
    {
        ListCar = GameObject.FindObjectsOfType<CarInfo>().ToList();
    }

    void Start()
    {
        ListCar = GameObject.FindObjectsOfType<CarInfo>().ToList();
        CarInfo.ChangeScore += UpdateUI;
        UpdateUI();
    }

    private void UpdateUI()
    {
        SortList();        
    }

    private void SortList()
    {
        ListCar.Sort();
    }
}
 
using UnityEngine;
using System.Collections;
using System;

public class CarInfo : MonoBehaviour, IComparable<CarInfo>
{
    public int Score;
    public string Name;

    public delegate void Change();
    public static event Change ChangeScore;

    public void AddScore()
    {
        Score++;
        if (ChangeScore != null) ChangeScore();
    }

    public int CompareTo(CarInfo other)
    {

        int result1 = Score.CompareTo(other.Score);
        if (result1 != 0)
        {
            return result1;
        }

        return 0;
    }
}
 Está probado y funciona correctamente, lo único que la lista la devuelve de menor a mayor.... Suerte, espero te sirva
#693
Es mas facil crear un componente y este añadirlo a cada Auto, aparte de que consume muchisimo menos recursos, pero aun no entiendo que quieres lograr, una lista de todos los jugadores ordenada?ejPedro 100
Juan 40
Alfredito 23 

Si es asi te doy una mano...
#695
General (Antiguo) / Hacer que el enemigo se destruya
Noviembre 13, 2015, 08:13:46 PM
El error es justamente por que esta mal puesta la expresión.. un error mio.
if(CurrentHealt <= MinHealt)if(Death != null)Death(); //Detectamos si llego al mínimo.
Solo cambia el "=<" por "<=" y llisto.
El problema de chocar y destruir es que deberias generar eventos, por ejemplo que al lanzar un Puñetazo se active la detección de la Mano si no estas atacando no deberia esta comprobando colisiones.
#696
General (Antiguo) / Hacer que el enemigo se destruya
Noviembre 13, 2015, 03:25:33 PM
Algo tan simple como un control de Salud no tiene que tener absolutamente nada estático, el problema se genera por 2 cosas, primero que cada vez que llamas la función RestarVidaEnemigo() esta se ejecuta en todos los Enemigos, y segundo "Destroy(GameObject.FindGameObjectWithTag("Enemigo"));" esto hace referencia al primer objeto que encuentra Unity con el tag "Enemigo". ¿Como se hace entonces?1- Creamos un componente y lo llamamos HealtControl (Nombre Opcional).2- Utilizamos 3 Métodos ApplyDamage ApplyCure, 1 Evento, 3 Variables.3- Actualizar cada parte del codigo donde aplicas cambia a la salud de cada personaje.Te Dejo el Codigo de Ej...
public class HealtControl : MonoBehaviour
{
public int MaxHealt = 100;
public int MinHealt = 0;

internal int CurrentHealt;
public delegate void DeathEvent();
public event DeathEvent Death:

void Start()
{
   if(CurrentHealt == 0)CurrentHealt = MaxHealt; // Asignamos MaxHealt como salud Inicial (CurrentHealt).
        Death += () => { Destroy(this.gameObject); } ;
 // Detectamos el Evento y Destruimos el Objeto.
}

internal void ApplyDamage(int Value)
{
   CurrentHealt -= Value; //Restamos Current healt por el valor de Value.
   CurrentHealt = Mathf.Clamp(CurrentHealt,MinHealt,MaxHealt); //Clampeamos los valores.
   if(CurrentHealt =< MinHealt)if(Death != null)Death(); //Detectamos si llego al minimo.
}

internal void ApplyCure(int Value)
{
   CurrentHealt += Value; //Aumentamos el valor de CurrentHealt.
   CurrentHealt = Mathf.Clamp(CurrentHealt,MinHealt,MaxHealt); //Clampeamos valores.
}
}

public class  ColisionPlayer: MonoBehaviour
{
    Transform playerT;
    public float sinkSpeed = 0.5f;
    AudioSource PatadaSonido;
    Player player;


    void Start()
    {
        playerT = GameObject.FindGameObjectWithTag("Player").transform;
        PatadaSonido = GetComponentInParent<AudioSource>();
        player = GetComponentInParent<Player>();
    }

    void OnTriggerEnter(Collider colision)
    {

        if (colision.gameObject.CompareTag("Enemigo"))
        {      
            //Vamos a utilizar una referencia a HealtControl para acceder a su metodo ApplyDamage().
            //Luego que hacemos la comprobacion de que existe dicho componente, vamos a llamar a la funcion ApplyDamage();
            var healt = colision.gameObject.GetComponent<HealtControl>(); //Tomamos el Componente HealtControl de la referencia.
            if(healt != null)healt.ApplyDamage(10);//Comprobamos si no es nulo y llamamos la funcion deseada.


            player.sliderAI.gameObject.SetActive(true);
            Player.damaged = true;
            PatadaSonido.Play();
            playerT.Translate(-Vector3.forward * sinkSpeed);


        }
        else
        {
            StartCoroutine(sliderEnemigo());
        }
       
   }

    IEnumerator sliderEnemigo()
    {
        yield return new WaitForSeconds(5f);
        player.sliderAI.gameObject.SetActive(false);
        yield return null;
    }

}
No te olvides de pasar por mi canal de YT, vas a entender cómo funcionan las variables con diferentes tipos de protección y acceso.
Otra Cosa, si necesitas detectar colisiones de cada parte del cuerpo ejemplo, Mano, Pie, Cabeza, es mejor crear referencia a las mismas y utilizar Physics comprobar la colisión. Código Ej.
public class BoneCollision : MonoBehaviour
{
//Creamos variables de referencia
public Transform[] BoneRef;
//Creamos Eventos
public delegate void Col(Transform ColRef);
public event Col ColBone;
//Conf
public float RadiusDetect = 5;
public LayerMask LayerCol;


void Update()
{
   //Creamos todos los los SphereCast para la deteccion de colision.
   RaycastHit hit;            
   foreach(Transform bone in BoneRef)
   {
      if (Physics.SphereCast(bone.position, RadiusDetect, bone.forward, out hit, 1,LayerCol))
        {
           if(ColBone != null)ColBone(hit.transform);
        }
   }        
}

void Start()
{
   ColBone += ((Transform Ref)=>
   {
      print(Ref.name);
      //Podemos Aplicar daño tambien
      var healt = Ref.GetComponent<HealtControl>(); //Tomamos el Componente HealtControl de la referencia.
            if(healt != null)healt.ApplyDamage(10);//Comprobamos si no es nulo y llamamos la funcion deseada.
   });
}
}
Todo esto lo hice sin comprobar si funcionaba, solo lo escribi..Este componente lo Asignas al Player y detecta todas las colisiones del player. Luego a la IA.. BoneRef -> Asignalo desde el inspector con el transform de la mano, pies y todos los que quieras que detecten colisión.Radius -> Radio del Collider de detecciónLayerCol -> Capas con la que queremos que colisione Saludos. 
#697
General (Antiguo) / Problema con los tags?
Noviembre 07, 2015, 04:31:57 PM
IsKinematic  
#698
General (Antiguo) / Mapas en unity
Noviembre 04, 2015, 04:49:15 PM
¿Unity3D para esto?, Unity3D es un Motor Gráfico, exclusivo para la Creación de Vídeo Juegos, y lo que tu quieres es un Sistema muy diferente a un juego.Para este tipo de desarrollo te propongo una herramienta para programar nativa mente en Android Eclipse o si quieres programar en C# puedes utilizar Xamarin y Visual Studio 2015
#699
General (Antiguo) / 5.2.2 p2
Noviembre 02, 2015, 01:22:45 AM
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34329" data-ipsquote-contentcommentid="122931 date=1446420609]Uno de los temores es que los compren y nos metan licencias abusivas.[/quote]No creo, ya que a ellos les sirve que exista gente con USO de la version no PROFESIONAL, ya que de 1.000.000 unos 5 son los que pueden tener éxito y los demás solo usan el programa.
Es mi punto de vista, aun que obvio puede pasar. 
#700
General (Antiguo) / Ayuda con photon networking !!
Noviembre 01, 2015, 03:36:29 PM
¿podría servirte esto? OnJoinedLobby() se llamaría justo cuando el jugador se logra conectar con el servidor.
#701
General (Antiguo) / 5.2.2 p2
Noviembre 01, 2015, 03:31:45 PM
Creo que lo mejor es quedarse en unity 5.1 y corriendo muchos riesgo, y si tienes pensado un proyecto algo mas serio decantaría por usar la 4.6.
Aun que todo lo que la version 5 presta es demasiado tentador, pero esto conlleva a millones de Bug y Errores, Unity saca las versiones muchas veces demasiado rápido, tanto que supongo que pasan por alto los Bug y tratar de solucionar los errores graves. Y aun diciendo todo esto, yo utilizo la 5.2.x Jaja, pero bueno, aun no estoy en nada serio, es solo para programar Tools y Otras cosas, siempre para terceros.
#702
Es muy Simple, las variables sincronizadas con SynVar simplemente se actualizan automáticamente en cada cliente, es decir, si en un servidor existen 3 cliente y cada uno tiene un variable nombre de tipo string, con SyncVar puedes hacer que esta misma se actualice en cada cliente EJ:
[SyncVar] private string Name;

void Start()
{
    SetName(new string[]{"Pedro","Juan","Roberto"}[Random.range(0,2)]);

private void SetName(string value)
{
      Name = value;
}
De este modo la variable Name estaría siendo sincronizada, pero para que todo funcione correctamente, cuando queremos cambiar el valor de una variable debemos hacerlo enviando la petición al servidor, entonces este se encarga de actualizarla en todas las instancias. 
[SyncVar] private string Name;

void Start()
{
    SetName(new string[]{"Pedro","Juan","Roberto"}[Random.range(0,2)]);

[Command]
private void Cmd_SetName(string value)
{
      Name = value;
}
Y eso es todo...
#703
General (Antiguo) / [APORTE] Object Pool
Octubre 31, 2015, 01:28:21 AM
Llie, ¿si capturas las excepciones?, creo que la solución en este caso seria utilizar try-cacth, cuando tenga un tiempo trato de ver como solucionarlo
#704
Te voy a contestar con la verdad, !Mejor dedícate a cortar pasto¡ Jamas podrias hacer algo que sea 1% igual a Whatsapp y menos parecido, ya que hablamos de algo sumamente complejo y de inversiones altisimas tanto en Desarrolladores, diseñadores y Plataforma, como WebServer y Servidores dedicados a cada X Cliente, por lo tanto, es sumamente imposible, por no decir que estas en el lugar incorrecto para buscar ayuda de este tipo, ya que algo como Whatsapp se debe programar nativamente.Por lo tanto, mejor olvidar tu proyecto...PD: Tu diseñador gráfico no es muy bueno, si esas imágenes son de su autoria.
#705
General (Antiguo) / SQLite + Unity3D
Octubre 26, 2015, 04:04:02 AM
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="32985" data-ipsquote-contentcommentid="121620">Tampoco mencionabas el volumen, sino que es sobre Android. En mis opciones mencionaba datos masivos aunque todos los vas a implementar en local solamente.Al final LINQ genera código SQL, pero tiene muchas ventajas de escalabilidad. De entrada, puedes implementarlo sobre lo que quieras, incluido SQLite o Listas. Si en el futuro cambias de gestor de bbdd o implementas algo más sofisticado, como decía en el apartado 3 (caché local + bbdd externa) lo tendrás más fácil en LINQ que en SQL directo, ya que podrás discriminar los datos locales de los remotos.Ahora bien, si lo que haces es 3000 inserts en un corto espacio de tiempo, ahí ya depende el tamaño de registro, índices, etc. más que de SQL. Pero vamos, es una situación atípica en un dispositivo móvil, ya que son en general transaccionales. Eso faltaba por mencionar.Por tanto y resumiendo, si tu preocupación es insertar 10000 registros lo más rápido posible y con el mejor rendimiento (en plan bulk load) utiliza HashSet. Nada va a ser más rápido. Ni listas ni bbdd ni sqlite.http://theburningmonk.com/2011/03/hashset-vs-list-vs-dictionary/ date=1445825435]http://theburningmonk.com/2011/03/hashset-vs-list-vs-dictionary/ [/quote]IRobb, Creo que no nos entendimos, entiendo todo lo que me dices, pero no necesitaba una Base de SQLite, solo preguntaba eso, se que es bueno que muchas veces comenten alternativas, pero ya conozco las alternativas que me mencionas y he decantado por SQLite para este proyecto por varias razones.De todos modos Gracias.