Jump to content
Sign in to follow this  
Megadok

ANSWERED Debug.DrawRay en un "for" loop.

Recommended Posts

Buenas gente!😅

Tengo un gameobject desde donde proyecto raycast2d a través de un "for".

Todo va de maravilla pero he detectado que, si por ejemplo lanzo 4 rayos desde el "for", cuando colisiono con el "0" me cambia de color el "1", cuando colisiono con el "1" me cambia de color el "2", y si colisiono con el "2" me cambia de color el "3". La colisión la he comprobado y funciona correctamente pero solo es que el color asignado desde el  Debug.DrawRay me colorea el "siguiente" rayo. Y si colisiono con el último, me colorea el primero.😱

  void rayo_deteccion()
    {

      for(int i = 0; i < numero_rayos; i++)
        {
            switch (_direccion)
            {
               
                case movimiento_2D.mirada.abajo:
                    hit = Physics2D.Raycast((Vector2)transform.position - new Vector2(-0.5f + (i * rango_distancia_rayos), offset_rayo), transform.TransformDirection(Vector2.down), alcance_rayo);
                    Debug.DrawRay((Vector2)transform.position - new Vector2(-0.5f + (i * rango_distancia_rayos), offset_rayo), transform.TransformDirection(Vector2.down) * alcance_rayo, r);
                    colisiona_rayo(hit,i);
                    
                    ; break;   
               
            }  
        }  
    }

    void colisiona_rayo(RaycastHit2D hit, int i) //con este metodo obtengo gracias a la "i" del "for" el rayo correcto PERO no el DebugDraw
    {
        if (numero_rayos > 0)
        {
            if (hit.collider != null)
            {
                Debug.Log("choca " + hit.collider.gameObject.name);
                r = Color.red;
                Debug.Log("Rayo i " + i.ToString());
            }
            else
            {
                r = Color.green;
            }
        }       
    }

¿Alguna solución?

Gracias!.

Share this post


Link to post
Share on other sites

Hola, sí eso pasa porque efectivamente "colisiona_rayo" se llama después del del Debug.DrawRay.

Podrías organizarlo un poco mejor así:

Share this post


Link to post
Share on other sites

Gracias @lightbugUna cosita más.

Ahora que todo funciona bien y en orden, me gustaría que cuando los rayos colisionen con mi gameobject, mi gameobject se pare(para eso reduzco su velocidad a 0), sin problema.

El caso es que he añadido un método para cuando hit != null y otro método en el "else" de la condición en el caso que sea null. Lo que me ocurre es que me da los dos resultados a la vez, entonces hace la llamada a los dos métodos a la vez, y mi gameobject no se para, porque se para y se mueve al mismo tiempo. Y creo que esto es debido a los resultados de los múltiples rayos que se elaboran en el "for" y se mezclan. 

¿Cómo puedo hacer para que si al menos un rayo colisiona, me de un valor "true" y éste predomine sobre el resultado de los demas rayos que no colisionan y producen null?
¿Cómo puedo hacer para que si ninguno de los rayos colisionan me de un valor "false"?

 

Gracias!😻

Edited by Megadok

Share this post


Link to post
Share on other sites
21 hours ago, Megadok said:

Y creo que esto es debido a los resultados de los múltiples rayos que se elaboran en el "for" y se mezclan. 

Es muy probable, igual si tenés el código sería mucho mejor.

21 hours ago, Megadok said:

¿Cómo puedo hacer para que si al menos un rayo colisiona, me de un valor "true" y éste predomine sobre el resultado de los demas rayos que no colisionan y producen null?

Podrías definir un flag (bool) que simplemente se ponga en true si algun rayo colisiona.

bool stopFlag = false;
for(int i = 0; i < numero_rayos; i++)
{
    ... mismo que antes
                                
    if( hit )
    	stopFlag = true;
 
}  
                                
if( stopFlag )
    Stop(); // velocity = 0

esto que puse acá podés replicarlo así:

bool stopFlag = false;

for( ... )
{

    ...

    stopFlag |= hit;
}

Que básicamente significa "si algún hit es true, stopFlag será siempre true, solamente si todos los hit son falsos stopFlag será falso"

Edited by lightbug

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...