Пример #1
0
    public void instanciarPresa(float x, float y, float z, BitArray codigoGen, int tiempo)
    {
        GameObject nuevaPresa       = Instantiate(presa, new Vector3(x, y, z), Quaternion.identity);
        turing     nuevaPresaTuring = nuevaPresa.GetComponent <turing>();

        nuevaPresaTuring.codigoGenetico = codigoGen;
        PresaComportamiento nuevaPresaComp = nuevaPresa.GetComponent <PresaComportamiento>();

        nuevaPresaComp.codigoGenetico = codigoGen;
        nuevaPresaComp.tiempoActual   = tiempo;
        nuevaPresaComp.edadMaxima     = edadMaximaPresa;
        TransformacionesPrueba nuevaPresaTransform = nuevaPresa.GetComponent <TransformacionesPrueba>();

        nuevaPresaTransform.codigoGenetico = codigoGen;
    }
    private bool reproducirse()
    {
        fertil = true;
        turing esteObjTuring = this.GetComponent <turing>();
        TransformacionesPrueba esteObjTransform = this.GetComponent <TransformacionesPrueba>();

        bool  parejaCercana        = false;
        int   masParecido          = 0;
        float distanciaConElActual = 0;

        distanciaConElActual = 135;

        for (int i = 0; i < Animales.todasLasPresas.Length; i++)
        {
            float distancia = Vector3.Distance(Animales.todasLasPresas[i].transform.position, transform.position);

            if (distancia <= vision)
            {
                float distanciaNueva = 0;

                turing nuevaPresaTuring = Animales.todasLasPresas[i].GetComponent <turing>();
                TransformacionesPrueba nuevaPresaTransform = Animales.todasLasPresas[i].GetComponent <TransformacionesPrueba>();

                distanciaNueva = distanciaNueva + Mathf.Abs((esteObjTuring.cantidadRojo - nuevaPresaTuring.cantidadRojo) * 10);
                distanciaNueva = distanciaNueva + Mathf.Abs((esteObjTuring.cantidadAzul - nuevaPresaTuring.cantidadAzul) * 10);
                distanciaNueva = distanciaNueva + Mathf.Abs((esteObjTuring.cantidadVerde - nuevaPresaTuring.cantidadVerde) * 10);
                distanciaNueva = distanciaNueva + Mathf.Abs(esteObjTransform.factorx - nuevaPresaTransform.factorx);
                distanciaNueva = distanciaNueva + Mathf.Abs(esteObjTransform.factory - nuevaPresaTransform.factory);

                if (distanciaConElActual > distanciaNueva && distanciaNueva > 0 && distanciaNueva <= diferenciaMaximaAceptada)
                {
                    distanciaConElActual = distanciaNueva;
                    masParecido          = i;
                    parejaCercana        = true;
                    parecidoConLaActual  = distanciaConElActual;
                    Vector3 vectorAPareja = Animales.todasLasPresas[i].transform.position - transform.position;
                    vectorAPareja    = new Vector3(vectorAPareja.x, 0, vectorAPareja.z);
                    direccionAPareja = Quaternion.FromToRotation(Vector3.back, vectorAPareja);
                    PresaComportamiento pareja1Comp = Animales.todasLasPresas[i].GetComponent <PresaComportamiento>();
                    parejaCercana = pareja1Comp.fertil;
                }
            }
        }
        return(parejaCercana);
    }
Пример #3
0
    void Start()
    {
        //string uno = String.Concat (Convert.ToInt32(codGen [0]),Convert.ToInt32(codGen [1]),Convert.ToInt32(codGen [2]),Convert.ToInt32(codGen [3]));
        //int aa = Convert.ToInt32 (uno,2);
        //Debug.Log (uno);
        //Debug.Log (aa);

        presaInst = presa;
        for (int i = 0; i < numerodepresas; i++)
        {
            BitArray   codigoGen        = generarCodigoGenetico();
            GameObject nuevaPresa       = Instantiate(presa, new Vector3(random.Next(-20, 20), 0, random.Next(-20, 20)), Quaternion.Euler(0, random.Next(360), 0));
            turing     nuevaPresaTuring = nuevaPresa.GetComponent <turing>();
            nuevaPresaTuring.codigoGenetico   = codigoGen;
            nuevaPresaTuring.turingHabilitado = turingHabilitadoPresa;
            PresaComportamiento nuevaPresaComp = nuevaPresa.GetComponent <PresaComportamiento>();
            nuevaPresaComp.codigoGenetico           = codigoGen;
            nuevaPresaComp.reproduccionHabilidada   = reproduccionHabilidadaParaPresas;
            nuevaPresaComp.diferenciaMaximaAceptada = diferenciaMaximaAceptadaParaReproducirse;
            nuevaPresaComp.alimentarse = presasPuedenAlimentarse;
            nuevaPresaComp.metabolismoPorCodigoGenetico = metabolismoPorCodigoGenetico;
            TransformacionesPrueba nuevaPresaTransform = nuevaPresa.GetComponent <TransformacionesPrueba>();
            nuevaPresaTransform.codigoGenetico = codigoGen;
        }
        for (int i = 0; i < numerodepredadores; i++)
        {
            BitArray   codigoGen     = generarCodigoGenetico();
            GameObject nuevoPredador = Instantiate(predador, new Vector3(random.Next(-20, 20), 0, random.Next(-20, 20)), Quaternion.identity);
            foreach (Transform t in nuevoPredador.transform)
            {
                if (t.gameObject.tag == "pielPredador")
                {
                    turing turingPredador = t.gameObject.GetComponent <turing>();
                    turingPredador.codigoGenetico = codigoGen;
                }
            }
        }
    }
    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "comida")
        {
            if (vida < capacidadDeAlmacenamiento)
            {
                vida = vida + 10;
            }
        }
        else if (collision.gameObject.tag == "predator")
        {
            Destroy(gameObject);
        }
        else if (collision.gameObject.tag == "pared")
        {
            //transform.rotation = Quaternion.Euler(0,360 - transform.rotation.eulerAngles.y,0);
            choqueParedOCompa     = true;
            tiempoDejarDeAlejarse = tiempoActual + intervaloAlejarseDePared;

            //Vector3 reflejo = Vector3.Reflect (Vector3.back, collision.contacts [0].normal);
            //Debug.Log (collision.contacts [0].normal.x + "  "+collision.contacts [0].normal.y + "  "+collision.contacts [0].normal.z + "  ");
            //Debug.Log (transform.rotation.eulerAngles.y);
            //transform.rotation = Quaternion.Euler (0,reflejo.y+180,0);
            float nuevoy, yex = transform.rotation.eulerAngles.y;
            if (collision.contacts [0].normal.x > 0.95f || collision.contacts [0].normal.x < -0.95f)
            {
                nuevoy = 360 - yex;
            }
            else
            {
                nuevoy = 180 - yex;
            }
            transform.rotation = Quaternion.Euler(0, nuevoy, 0);
        }
        else if (collision.gameObject.tag == "presa" && reproduccionHabilidada)
        {
            /////////////////

            turing esteObjTuring = this.GetComponent <turing>();
            TransformacionesPrueba esteObjTransform = this.GetComponent <TransformacionesPrueba>();

            PresaComportamiento pareja1Comp         = collision.gameObject.GetComponent <PresaComportamiento>();
            turing pareja1Turing                    = collision.gameObject.GetComponent <turing>();
            TransformacionesPrueba pareja1Transform = collision.gameObject.GetComponent <TransformacionesPrueba>();

            bool parejaDispuesta         = pareja1Comp.fertil;
            bool parejaRecienReproducida = pareja1Comp.recienReproducido;


            float distanciaConElActual = 0;

            distanciaConElActual = distanciaConElActual + Mathf.Abs((esteObjTuring.cantidadRojo - pareja1Turing.cantidadRojo) * 10);
            distanciaConElActual = distanciaConElActual + Mathf.Abs((esteObjTuring.cantidadAzul - pareja1Turing.cantidadAzul) * 10);
            distanciaConElActual = distanciaConElActual + Mathf.Abs((esteObjTuring.cantidadVerde - pareja1Turing.cantidadVerde) * 10);
            distanciaConElActual = distanciaConElActual + Mathf.Abs(esteObjTransform.factorx - pareja1Transform.factorx);
            distanciaConElActual = distanciaConElActual + Mathf.Abs(esteObjTransform.factory - pareja1Transform.factory);

            if (distanciaConElActual <= diferenciaMaximaAceptada && fertil && parejaDispuesta)
            {
                BitArray codigoGenActual = esteObjTuring.codigoGenetico;
                BitArray codigoGenPareja = pareja1Turing.codigoGenetico;

                int      splitCode = 1 + random.Next(35);
                BitArray codigoGen = new BitArray(36);
                for (int a = 0; a < splitCode; a++)
                {
                    codigoGen[a] = codigoGenPareja[a];
                }
                for (int a = splitCode; a < codigoGen.Length; a++)
                {
                    codigoGen[a] = codigoGenActual[a];
                }

                //Animales.instanciarPresa (transform.position.x, transform.position.y, transform.position.z, codigoGen);

                GameObject hijo = presa;

                /*
                 * //turing nuevaPresaTuring = hijo.GetComponent<turing>();
                 * hijo.GetComponent<turing>().codigoGenetico = codigoGen;
                 * //PresaComportamiento nuevaPresaComp = hijo.GetComponent<PresaComportamiento>();
                 * hijo.GetComponent<PresaComportamiento>().codigoGenetico = codigoGen;
                 * //TransformacionesPrueba nuevaPresaTransform = hijo.GetComponent<TransformacionesPrueba>();
                 * hijo.GetComponent<TransformacionesPrueba>().codigoGenetico = codigoGen;
                 */

                GameObject nuevaPresa       = Instantiate(Animales.presaInst, new Vector3(transform.position.x, transform.position.y, transform.position.z), Quaternion.identity);
                turing     nuevaPresaTuring = nuevaPresa.GetComponent <turing>();
                nuevaPresaTuring.codigoGenetico = codigoGen;
                PresaComportamiento nuevaPresaComp = nuevaPresa.GetComponent <PresaComportamiento>();
                nuevaPresaComp.codigoGenetico = codigoGen;
                nuevaPresaComp.tiempoActual   = tiempoActual;
                TransformacionesPrueba nuevaPresaTransform = nuevaPresa.GetComponent <TransformacionesPrueba>();
                nuevaPresaTransform.codigoGenetico = codigoGen;

                fertil            = false;
                recienReproducido = true;
                vida = vida / 2;
                tiempoParaReproducirse  = tiempoActual + tiempoDeEsperaEntreReproducciones;
                transform.rotation      = Quaternion.Euler(0, transform.rotation.eulerAngles.y + 180, 0);
                choqueParedOCompa       = true;
                tiempoDejarDeAlejarse   = tiempoActual + intervaloAlejarseDeCompa;
                tiempoRecienReproducido = 2;
            }
            if (distanciaConElActual <= diferenciaMaximaAceptada && fertil && parejaRecienReproducida)
            {
                fertil                  = false;
                vida                    = vida / 2;
                recienReproducido       = true;
                tiempoRecienReproducido = 2;
            }
            /////////////////
        }
    }