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 @lightbug! Una 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

Gracias¬†@lightbug,¬†me vino muy bien la explicaci√≥n, pude al final conseguirlo.‚ėļÔłŹ

  • Like 1

Share this post


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

×
×
  • Create New...