Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

rotar true y false con la misma accion

Iniciado por kalm97, Diciembre 02, 2015, 01:41:51 AM

Tema anterior - Siguiente tema
Buenas a todos tengo una duda quiero que cuando el enemigo choque con otro se den la vuelta y sigan su curso ya logre q giren y avancen pero solo lo hacen una vez y no se como hacer un bucle o algo asi aqui les dejo el script que tengo...    void Update () {
        if (!right) {
            transform.Translate (Vector3.left * Time.deltaTime * velocidad, Camera.main.transform);
        }
        if (right) {
            transform.Translate (Vector3.right * Time.deltaTime * velocidad, Camera.main.transform);
        }
    }    void OnTriggerEnter2D(Collider2D col){
        
        if(col.isTrigger != true){
            
            if(col.CompareTag("Player")){
                col.GetComponent<Player>().Damage(1);
            }
        }
        if (col.isTrigger != true) {
            if(col.CompareTag("Enemy")){
                this.transform.Rotate (Vector3.up, 180);
                right = true;
            }
        }
    }marque en rojo lo que quiero hacer q cada vez que compare Enemy eso aga true false true false asi no se si me entendieron.....

Diciembre 02, 2015, 09:28:59 AM #1 Ultima modificación: Diciembre 02, 2015, 09:29:44 AM por Quel
Parece que asignas la variable booleana right a true, pero no veo ningún lugar donde vuelva a ser asignada a false.A parte de eso tu código esta lleno de comandas redundantes.1) En el Update, si estas comparando una booleana, no es necesario hacer dos if. Bastaría con un if...else.
if (right)
    transform.Translate (Vector3.right * Time.deltaTime * velocidad, Camera.main.transform);
else
    transform.Translate (Vector3.left * Time.deltaTime * velocidad, Camera.main.transform);
O si quieres hacerlo mas "elegante", podrías usar un if simplificado
transform.Translate (((right) ? Vector3.right : Vector3.left) * Time.deltaTime * velocidad, Camera.main.transform);
2) En el OntriggerEnter2D, tienes un if duplicado. Comparas dos veces si el col.isTrigger es diferente de true. Un poco absurdo. Por no entrar en que quizás quedaría mas lógico comparar en si es false , en lugar de mirar si no es true.

kalm97 como ya lo dijeron, pero lo voy a repetir, estás redundando mucho. Trata de simplificar esa parte de código que tienes y si en tu proyecto tienes algo mas así, igualmente simplifica. Utiliza, if()... despues, else... o condicionales añidados (Puedes estudiar las estructuras de los condicionales) en fin todo depende de lo que necesites. Y referente a tu pregunta, podrías intentarlo haciendo right = false, para que si vuelve y choca vuelva y giren, lo puedes hacer así. if (col.isTrigger != true) {
            if(col.CompareTag("Enemy")){
                this.transform.Rotate (Vector3.up, 180);
                right = true;StartCoroutine(EjmRepetirProceso());
            }El IEnumerator es una funcion aparte.IEnumerator EjmRepetirProceso ()
    {
        yield return new WaitForSeconds(2);        right = false;
    }Intentalo así, es una posible solucion diferente a la que da el compañero Quel, que depronto te puedo servir y que se me ocurre así de momento. Intentalo y comentas. Éxitos   

lo que pasa ahora es que cuando choca con enemy se da la vuelta pero en 2 segundos vuelve a right = true, como hago que en vez de un tiempo gire, que cuando vuelva a entrar en un collider cambie a false, osea cada vez que choque con un collider enemy cambie su regla de true a false y viceversa. Pero me guardo que en un tiempo cambie me puede servir grasias , porfavor no mas ese detallito que me ayuden yo feliz, tambien ya cambien la los 2 if por un if y un else.. 

que onda. tengo un script en casa, que a lo mejor te puede servir, lleganod te lo paso a ver que tal saludos

Mmm haber, en el codigo que mostraste estas diciendo que al chocar, haga right = true, y con lo que te mostre, deberia a los dos segundos (O el tiempo que quieras) poner ese right = false y así, al volver a chocar, va a estar en false y se repite el proceso. Debería de funcionar lo que pides (Osea estar entre, true y false). Te aseguraste de poner la corrutina fuera del Update() ?Espero tu respuesta. Saludos. 

Diciembre 04, 2015, 12:36:18 AM #6 Ultima modificación: Diciembre 04, 2015, 12:58:54 AM por kalm97
sabes cuales es el problema que acabo de analizar esque nesecito que cambie right a false cuando choque con otro enemy, no que cambie en 2 segundos, entonces seria que cada vez que choque a enemy cambie de right a false es para mi enemigo que cuando choque con otro no queden como retrasados.... losiento por mi falta 

ya lo aregle aqui les dejo como ise...         if (col.isTrigger != true) {
            if (col.CompareTag ("Enemy")) {
                    if (intercambiador) {
                       this.transform.Rotate (Vector3.up, 180);
                       right = false;
                       intercambiador = false;
                    }
                    else{
                        this.transform.Rotate (Vector3.up, 180);
                        right = true;
                        intercambiador = true;
                    }            }ise una variable aparte para que sea repetible  no e sido tan bruto jeje grasias con todo

Etiquetas: